约束
作用:保证数据的完整性、一致性。
分类:
- 表级约束:对多个数据列的约束
- 列级约束:对一个数据列的约束
- 区别:表级约束只能在列定义时声明;列级约束可以在定义后声明
具体
- NOT NULL 非空约束
- PRIMARY KEY 主键约束:保证唯一性,自动为非空,只有一个
- UNIQUE KEY 唯一约束:保证唯一性,可以为空,可以多个
- DEFAULT 默认约束:没有赋值时,自动赋默认值,可以多个
- FOREIGN KEY 外键约束:实现1对n的关系(n为自然数)
主键约束
添加
ALTER TABLE tb_name ADD [ CONSTRAINT [symbol ] ]
PRIMARY KEY [ index_type ] ( index_col_name,... );
eg.:
ALTER TABLE user ADD CONSTRAINT id
PRIMARY KEY (id);
删除
ALTER TABLE tb_name DROP PRIMARY KEY;
eg.:
ALTER TABLE user DROP PRIMARY KEY;
唯一约束
添加
ALTER TABLE tb_name ADD [ CONSTRAINT [symbol ] ]
UNIQUE [ INDEX | KEY ] [ index_name ] [ index_type ]
( index_col_name,... );
eg.:
ALTER TABLE user ADD UNIQUE (username);
删除
ALTER TABLE tb_name DROP {INDEX | KEY} index_name
eg.:
ALTER TABLE user DROP INDEX username;
默认约束
添加、删除
ALTER TABLE tb_name ALTER [COLUMN] col_name
{ SET DEFAULT literal | DROP DEFAULT };
eg.:
ALTER TABLE user ALTER age SET DEFAULT 15;
外键约束
(子表有外键列的表,父表有参照列的)
- 父子表,使用相同的存储引擎,非临时表
- 数据表的存储引擎为InnoDB
- 外键列和参照列有相似的数据类型(数字长度、有无符号必须相同)
- 外键列和参照列有索引(外键列默认自动创建)
修改存储引擎(编辑配置文件my.ini)
default-storge-engine = InnoDB
外键约束的参照操作
- CASCDE:当父表(删除|更新),则自动(删除|更新)子表对应的行
- SET NULL:当父表(删除|更新),则设置表中的外键列为null
- RESTRICT:拒绝对父表(删除|更新)
- NO ACTION:同RESTRICT
添加
ALTER TABLE tb_name ADD [ CONSTRAINT [symbol ] ]
FOREIGN KEY [ index_name ] ( index_col_name,... )
reference_definition;
eg.:
ALTER TABLE user ADD FOREIGN KEY (pid) REFERENCES test (id);
删除
ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol;
eg.:
ALTER TABLE user DROP FOREIGN KEY pid;
数据表操作
创建数据表
(最后一个不+,)
CREATE TABLE [IF NOT EXISTS] table_name(
column_name DATATYPE [UNSIGNED] [AUTO_INCREMENT] [PRIMARY KEY]
[ NULL | NOT NULL],
...
);
- UTO_INCREMENT 自动编号:必须和主键一起用,起始为1,每次+1
eg.:test表pid,参照user表中的id
CREATE TABLE test (
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL UNIQUE KEY,
age TINYINT UNSIGNED NULL,
sex ENUM('W','M',N) DEFAULT 'N',
pid BIGINT,
FOREIGN KEY (pid) REFERENCES user (id) ON DELETE CASCADE
);
修改数据表
ALTER TABLE tb_name RENAME [TO | AS ] new_tb_name;
RENAME TABLE tb_name TO new_tb_name
[,tb_name2 TO new_tb_name2]...;
添加单列
ALTER TABLE tb_name ADD [COLUMN] col_name
column_definition [ FIRST | AFTER col_name ] ;
eg.:
ALTER TABLE test ADD COLUMN password
VARCHAR(20) NOT NULL AFTER;
添加多列
ALTER TABLE tb_name ADD [COLUMN]
( col_name column_definition ,...);
eg.:
ALTER TABLE user ADD COLUMN
( age SMALLINT ,
address VARCHAR(32)
);
删除列
ALTER TABLE tb_name DROP [COLUMN] col_name;
eg.:
ALTER TABLE user DROP COLUMN password;
修改列定义
ALTER TABLE tb_name MODIFY [COLUMN] col_name
column_definition [FIRST | AFTER col_name]
修改列名称
ALTER TABLE tb_name CHANGE [COLUMN] old_col_name
new_col_name column_definition [FIRST | AFTER col_name]
查看数据表
SHOW TABLES [FROM db_name ]
[ LIKE 'pattern' | WHERE expr ]
eg.:
SHOW TABLES FROM test;
查看数据表结构
SHOW COLUMNS FROM tb_name;
eg.:
SHOW COLUMNS FROM test;