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 默认值
create table t2(deptid varchar(20),deptname varchar(50) not null,location varchar(100),primary key(deptid));create table t1(id int auto_increment primary key,ids char(20) unique key,sex char(2) not null comment '部门',salary decimal(8,2) default 0,deptno varchar(20),foreign key(deptno) references t2(deptid));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 | |+--------+--------------+------+-----+---------+----------------+5 rows in set (0.00 sec)mysql> desc t2;+----------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+--------------+------+-----+---------+-------+| deptid | varchar(20) | NO | PRI | NULL | || deptname | varchar(50) | NO | | NULL | || location | varchar(100) | YES | | NULL | |+----------+--------------+------+-----+---------+-------+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='人员信息表' |
