1.表与列

lower_case_table_names
在linux系统中,默认情况下这个变量的值为0,意思是存储,比较表时都区分大小写。
在windows系统中,默认情况下这个变量的值为1,意思是存储,比较表示不区分大小写。
在MacOS中,这个变量的默认值是2,存储时使用原本的形式存储,比较时都转换成小写。Linux系统不支持这个变量设置为2,如果设置为2,会强制转换成0。
如果使用innodb的表,应该将这个变量的值设为1,将所有的表名转换成小写。

约束:
1/not null 非空约束,设置了这个值,字段将不存在null
2/primary key ,主键约束
3/foreign key ,外键约束
4/unique key ,唯一约束,不能出现重复值
5/default value 默认值

  1. create table t2(deptid varchar(20),
  2. deptname varchar(50) not null,
  3. location varchar(100),
  4. primary key(deptid)
  5. );
  6. create table t1(id int auto_increment primary key,
  7. ids char(20) unique key,
  8. sex char(2) not null comment '部门',
  9. salary decimal(8,2) default 0,
  10. deptno varchar(20),
  11. foreign key(deptno) references t2(deptid)
  12. );
  13. mysql> desc t1;
  14. +--------+--------------+------+-----+---------+----------------+
  15. | Field | Type | Null | Key | Default | Extra |
  16. +--------+--------------+------+-----+---------+----------------+
  17. | id | int(11) | NO | PRI | NULL | auto_increment |
  18. | ids | char(20) | YES | UNI | NULL | |
  19. | sex | char(2) | NO | | NULL | |
  20. | salary | decimal(8,2) | YES | | 0.00 | |
  21. | deptno | varchar(20) | YES | MUL | NULL | |
  22. +--------+--------------+------+-----+---------+----------------+
  23. 5 rows in set (0.00 sec)
  24. mysql> desc t2;
  25. +----------+--------------+------+-----+---------+-------+
  26. | Field | Type | Null | Key | Default | Extra |
  27. +----------+--------------+------+-----+---------+-------+
  28. | deptid | varchar(20) | NO | PRI | NULL | |
  29. | deptname | varchar(50) | NO | | NULL | |
  30. | location | varchar(100) | YES | | NULL | |
  31. +----------+--------------+------+-----+---------+-------+
  32. 3 rows in set (0.00 sec)

关于主外键的的字段类型,如果主外键的字段类型不一致可能会导致查询时无法使用索引。
对于设置了自增的列,默认从1开始,步长为1增长。可以对自增列插入0或者null来自动插入自增列的值。

设置表的备注:

alter table t1 comment '人员信息表';

复制表:

create table t3 as select * from t1;  --会创建表并复制数据
create table t4 like t1; --只会创建表结构

添加字段:

alter table t1 add address varchar(100) comment '地址';

mysql> desc t1;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| ids     | char(20)     | YES  | UNI | NULL    |                |
| sex     | char(2)      | NO   |     | NULL    |                |
| salary  | decimal(8,2) | YES  |     | 0.00    |                |
| deptno  | varchar(20)  | YES  | MUL | NULL    |                |
| address | varchar(100) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

修改列:
修改列有两种方式,一种modify,可以修改字段的类型,大小。一种是change,可以修改字段的类型大小,以及名称。modify是不可以修改列名的。

alter table t1 modify address varchar(200);
mysql> desc t1;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| ids     | char(20)     | YES  | UNI | NULL    |                |
| sex     | char(2)      | NO   |     | NULL    |                |
| salary  | decimal(8,2) | YES  |     | 0.00    |                |
| deptno  | varchar(20)  | YES  | MUL | NULL    |                |
| address | varchar(200) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

alter table t1 change address address2 varchar(300);
mysql> desc t1;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| ids      | char(20)     | YES  | UNI | NULL    |                |
| sex      | char(2)      | NO   |     | NULL    |                |
| salary   | decimal(8,2) | YES  |     | 0.00    |                |
| deptno   | varchar(20)  | YES  | MUL | NULL    |                |
| address2 | varchar(300) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

修改表名:
因为t1有个字段deptno这个字段是依赖于t2的外键,在修改t2表名的同时,也会将t1的建表语句修改掉。

mysql> alter table t2 rename to department;
Query OK, 0 rows affected (0.00 sec)

| t1    | CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ids` char(20) DEFAULT NULL,
  `sex` char(2) NOT NULL COMMENT '部门',
  `salary` decimal(8,2) DEFAULT '0.00',
  `deptno` varchar(20) DEFAULT NULL,
  `address2` varchar(300) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ids` (`ids`),
  KEY `deptno` (`deptno`),
  CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `department` (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='人员信息表'        |