-- mysql建表约束.sql-- 1. 主键约束
它能够确定一张表中的一条记录,通过给某个字段添加约束,就可以使得字段
不重复且不为空。
createtableuser(
id intprimarykey,
name varchar(20));insertintouservalues(1,'张三');insertintouservalues(2,'张三');insertintouservalues(null,'张三');--会失败,不可为空。-- 联合主键:--- 联合的主键值加起来不重复即可。createtable user2(
id int,
name varchar(20),
password varchar(20),primarykey(id,name));describe user2;--输出如下:+----------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+----------+-------------+------+-----+---------+-------+| id |int|NO| PRI |NULL||| name |varchar(20)|NO| PRI |NULL||| password |varchar(20)| YES ||NULL||+----------+-------------+------+-----+---------+-------+insertinto user2 values(1,'张三','123');insertinto user2 values(2,'张三','123');insertinto user2 values(1,'三','123');select*from user2;+----+--------+----------+| id | name | password |+----+--------+----------+|1| 三 |123||1| 张三 |123||2| 张三 |123|+----+--------+----------+-- 2. 自增约束
与主键约束组合,管控主键的值,自动增加序号,方便使用。
createtable user3(
id intprimarykeyauto_increment,
name varchar(20));
mysql>insertinto user3(name)values('zhansna');
mysql>insertinto user3(name)values('zhansna');
mysql>insertinto user3(name)values('zhansna');
mysql>select*from user3;+----+---------+| id | name |+----+---------+|1| zhansna ||2| zhansna ||3| zhansna |+----+---------+-- 创建表的时候,忘记创建主键约束。createtable user4(
id int,
name varchar(20));-- 修改表结构,添加主键。altertable user4 addprimarykey(id);describe user4;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id |int|NO| PRI |NULL||| name |varchar(20)| YES ||NULL||+-------+-------------+------+-----+---------+-------+-- 使用modify修改字端,添加约束。altertable user4 modify id intprimarykey;describe user4;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id |int|NO| PRI |NULL||| name |varchar(20)| YES ||NULL||+-------+-------------+------+-----+---------+-------+-- 删除主键; altertable user4 dropprimarykey;-- 3. 唯一约束--- 约束修饰的字段值不可以重复createtable user5(
id int,
name varchar(20));altertable user5 addunique(name);describe user5;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id |int| YES ||NULL||| name |varchar(20)| YES | UNI |NULL||+-------+-------------+------+-----+---------+-------+--或者createtable user5(
id int,
name varchar(20),unique(name));--或者createtable user5(
id int,
name varchar(20)unique);-- 删除唯一约束dropaltertable user5 dropindex name;-- 添加唯一约束modifyaltertable user5 modify name varchar(20)unique;-- 总结---(1. 建表的时候添加约束---(2 后期使用alter ...add...---(3 后期使用alter....modify...---(4 删除约束alter....drop.....-- 4. 非空约束--- 修饰的字段不能为空。createtable user9(
id int,
name varchar(20)notnull);insertinto user9 values(1,'zhangsan');insertinto user9(name)values('lisi');describe user9;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id |int| YES ||NULL||| name |varchar(20)|NO||NULL||+-------+-------------+------+-----+---------+-------+select*from user9;+------+----------+| id | name |+------+----------+|1| zhangsan ||NULL| lisi |+------+----------+-- 5. 默认约束--- 插入字段时,如果没有传值,就会使用默认值。createtable user10(
id int,
name varchar(20),
age intdefault10);insertinto user10(id, name)values(1,'zhangsan');--有输入,则代替默认值insertinto user10 values(1,'zhangsan',11);select*from user10;+------+----------+------+| id | name | age |+------+----------+------+|1| zhangsan |10||1| zhangsan |11|+------+----------+------+-- 6. 外键约束--- 涉及到两个表,主表,副表。--班级:主表(删除表:DROP TABLE table_name;)createtable classes(
id intprimarykey,
name varchar(20));describe classes;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id |int|NO| PRI |NULL||| name |varchar(20)| YES ||NULL||+-------+-------------+------+-----+---------+-------+--学生:副表createtable students(
id intprimarykey,
name varchar(20),
class_id int,foreignkey(class_id)references classes(id));describe students;+----------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+----------+-------------+------+-----+---------+-------+| id |int|NO| PRI |NULL||| name |varchar(20)| YES ||NULL||| class_id |int| YES | MUL |NULL||+----------+-------------+------+-----+---------+-------+---插入数据到classes中insertinto classes values(1,'一般');insertinto classes values(2,'二般');insertinto classes values(3,'三般');insertinto classes values(4,'四般');select*from classes;+----+--------+| id | name |+----+--------+|1| 一般 ||2| 二般 ||3| 三般 ||4| 四般 |+----+--------+---插入数据到students中insertinto students values(1001,'章三',1);insertinto students values(1002,'里斯',2);insertinto students values(1003,'王武',3);insertinto students values(1004,'找刘',4);select*from students;+------+--------+----------+| id | name | class_id |+------+--------+----------+|1001| 章三 |1||1002| 里斯 |2||1003| 王武 |3||1004| 找刘 |4|+------+--------+----------+insertinto students values(1005,'拿吧',5);
ERROR 1452(23000): Cannot addorupdate a child row:
a foreignkeyconstraint fails (`pet`.`students`,CONSTRAINT`students_ibfk_1`FOREIGNKEY(`class_id`)REFERENCES`classes`(`id`))--- 1. 要是主表中没有的数据值,副表中不可以使用。deletefrom classes where id=4;
ERROR 1451(23000): Cannot deleteorupdate a parent row:
a foreignkeyconstraint fails (`pet`.`students`,CONSTRAINT`students_ibfk_1`FOREIGNKEY(`class_id`)REFERENCES`classes``id`))--- 2. 主表记录被副表使用,则不可以删除。