mysql建表約束
主鍵約束
它能夠唯一確定一張表中的一條記錄,也就是我們通過給某個字段添加約束,就可以使的該字段不重複且不爲空。
mysql> create table user(
-> id int primary key,
-> name varchar(20)
mysql> insert into user values(1,'zs');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values(1,'zs');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into user values(2,'zs');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values(NULL,'zs');
ERROR 1048 (23000): Col
umn 'id' cannot be null
id有主鍵約束,所以不能添加重複的,也不能爲空。
聯合主鍵(兩個加起來不重複就可以)
primary key(id,name)
mysql> create table user2(
-> id int,
-> name varchar(20),
-> passwd varchar(20),
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user2 values(1,'zs','123');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user2 values(1,'zs','123');
ERROR 1062 (23000): Duplicate entry '1-zs' for key 'PRIMARY'
mysql> insert into user2 values(2,'zs','123');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user2 values(1,'ls','123');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user2 values(1,NULL,'123');
ERROR 1048 (23000): Column 'name' cannot be null
聯合主鍵裏面任何一個字段不能爲空
自增約束
自動生成id,id自動增長
mysql> insert into user3 (name) values('zs');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user3;
+----+------+
| id | name |
+----+------+
| 1 | zs |
+----+------+
1 row in set (0.00 sec)
mysql> insert into user3 (name) values('zs');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user3;
+----+------+
| id | name |
+----+------+
| 1 | zs |
| 2 | zs |
+----+------+
2 rows in set (0.00 sec)
創建表的時候忘記創建主鍵約束了怎麼辦?用alter修改表結構,添加主鍵。
mysql> create table user4( id int, name varchar(20) );
mysql> alter table user4 add primary key(id);
刪除主鍵:
mysql> alter table user4 drop primary key;
修改主鍵約束:使用modify修改約束添加字段。
mysql> alter table user4 modify id int primary key;
唯一約束
約束脩飾的字段的值不可以重複
mysql> create table user5( id int, name varchar(20) );
mysql> alter table user5 add unique(name);
mysql> desc user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
mysql> insert into user5 values(1,'zs');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user5 values(1,'zs');
ERROR 1062 (23000): Duplicate entry 'zs' for key 'name'
mysql> insert into user5 values(2,'zs');
ERROR 1062 (23000): Duplicate entry 'zs' for key 'name'
mysql> insert into user5 values(2,'ls');
Query OK, 1 row affected (0.00 sec)
mysql> create table user6( id int, name varchar(20),unique(name));
mysql> create table user7( id int, name varchar(20) unique);
使用modify添加約束
mysql> create table user7( id int, name varchar(20));
mysql> alter table user7 modify name varchar(20) unique;
以上四個實現功能一樣(user5,user6,user7)
約束兩個,這兩個字段都不能重複(組合在一起不重複就行)
mysql> create table user8( id int, name varchar(20),unique(id,name));
刪除唯一約束
mysql> alter table user7 drop index name;
添加約束方式:
1.建表的時候添加約束
2.建表完後使用 alter…add…
3.建表完後使用 alter…modify…
非空約束-------修飾的字段不能爲空
mysql> create table user9( id int, name varchar(20) not null);
mysql> desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
name字段不能爲空
默認約束-----當我們插入字段值的時候如果沒有傳值就會使用默認值
mysql> create table user10( id int, name varchar(20),age int default 10);
mysql> desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
插入數據
mysql> insert into user10 (id,name) values(1,'zs');
mysql> select * from user10;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | zs | 10 |
+------+------+------+
mysql> insert into user10 values(1,'zs',19);
mysql> select * from user10;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | zs | 10 |
| 1 | zs | 19 |
+------+------+------+
沒寫值自動填默認值,寫了就寫了唄
外鍵約束
涉及兩個表:父表,子表或者是主表、副表
mysql> create table classes( id int primary key, name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> create table students( id int primary key, name varchar(20),class_id int,foreign key(class_id) references classes(id));
mysql> insert into classes values(1,'yi');
Query OK, 1 row affected (0.00 sec)
mysql> insert into classes values(2,'er');
mysql> insert into classes values(3,'san');
mysql> insert into classes values(4,'si');
mysql> select * from classes;
+----+------+
| id | name |
+----+------+
| 1 | yi |
| 2 | er |
| 3 | san |
| 4 | si |
+----+------+
mysql> insert into students values(1001,'zs',1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into students values(1002,'zs',2);
mysql> insert into students values(1003,'zs',3);
mysql> insert into students values(1004,'zs',4);
mysql> insert into students values(1005,'zs',5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
主表裏不存在的副表不能使用
主表中的記錄被副表引用,是不能被刪除的。
mysql> delete from classes where id=4;
ERROR 1451 (23000)...