目錄
1,主鍵約束
一般情況下每張表中都需要創建一列作爲主鍵列
特性:
1,非空
2,唯一,即不允許重複
3, 被引用可以作爲其他表的外鍵
三種創建方式
第一種:直接在某一列後面加關鍵字:“PRIMARY KEY”
create table stu(
sid int(6) primary key,
sname varchar(20),
age int(3),
gender varchar(10)
);
第二種在:專門去指定某一列爲主鍵列,PRIMARY KEY(<列名>)
create table stu(
sid int(6),
sname varchar(20),
age int(3),
gender varchar(10),
primary key(sid)
);
第三種:alter table stu add primary key(sid);
MariaDB [mydb]> alter table stu add primary key(sid);
Query OK, 0 rows affected (0.088 sec)
Records: 0 Duplicates: 0 Warnings: 0
2,主鍵自增長約束
滿足是主鍵且是整數可以進行自增操作。
方式一:在主鍵後邊添加“auto_increment”
create table stu(
sid int(6) primary key auto_increment,
sname varchar(20),
age int(3),
gender varchar(10)
);
MariaDB [mydb]> insert into stu(sname) values("張三");
Query OK, 1 row affected (0.007 sec)
MariaDB [mydb]> insert into stu values(0,"李四",16,"一班");
Query OK, 1 row affected (0.012 sec)
MariaDB [mydb]> select * from stu;
+-----+--------+------+--------+
| sid | sname | age | gender |
+-----+--------+------+--------+
| 1 | 張三 | NULL | NULL |
| 2 | 李四 | 16 | 一班 |
+-----+--------+------+--------+
2 rows in set (0.001 sec)
方式二:alter table <表名> change <主鍵> <主鍵> <主鍵類型> auto_increment;
MariaDB [mydb]> alter table stu change sid sid int auto_increment;
Query OK, 0 rows affected (0.077 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [mydb]> desc stu;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.005 sec)
3,非空約束
當某些列不能設置爲NULL值,所以可以對列添加非空約束。關鍵字“not null”
create table stu(
sid int(6),
sname varchar(20) not null,
age int(3),
gender varchar(10)
);
MariaDB [mydb]> create table stu(
-> sid int(6),
-> sname varchar(20) not null,
-> age int(3),
-> gender varchar(10)
-> );
Query OK, 0 rows affected (0.046 sec)
MariaDB [mydb]> desc stu;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sid | int(6) | YES | | NULL | |
| sname | varchar(20) | NO | | NULL | |
| age | int(3) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
MariaDB [mydb]> insert into stu values(0,null,1,"5");
ERROR 1048 (23000): Column 'sname' cannot be null
4,唯一約束
數據庫中某些列不能設置重複的值,不重複但是可以爲空。關鍵字“unique”
create table stu(
sid int(6),
sname varchar(20) unique,
age int(3),
gender varchar(10)
);
MariaDB [mydb]> create table stu(
-> sid int(6),
-> sname varchar(20) unique,
-> age int(3),
-> gender varchar(10)
-> );
Query OK, 0 rows affected (0.046 sec)
MariaDB [mydb]> desc stu;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sid | int(6) | YES | | NULL | |
| sname | varchar(20) | YES | UNI | NULL | |
| age | int(3) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.005 sec)
MariaDB [mydb]> insert into stu values( 0, "張三", 1, "5" );
Query OK, 1 row affected (0.007 sec)
MariaDB [mydb]> insert into stu values( 1, "張三", 2, "6" );
ERROR 1062 (23000): Duplicate entry '張三' for key 'sname'
MariaDB [mydb]> insert into stu values( 3, null, 3, "7" );
Query OK, 1 row affected (0.008 sec)
MariaDB [mydb]> select * from stu;
+------+--------+------+--------+
| sid | sname | age | gender |
+------+--------+------+--------+
| 0 | 張三 | 1 | 5 |
| 3 | NULL | 3 | 7 |
+------+--------+------+--------+
2 rows in set (0.001 sec)
5,默認值約束
如果不給值就使用定義的默認值。關鍵字“default” default <初始值> 注意: 如果值是字符串和日期需要加單引號
create table stu(
sid int(6),
sname varchar(20),
age int(3),
gender varchar(10) default "1"
);
MariaDB [mydb]> create table stu(
-> sid int(6),
-> sname varchar(20),
-> age int(3),
-> gender varchar(10) default "1"
-> );
Query OK, 0 rows affected (0.033 sec)
MariaDB [mydb]> desc stu;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sid | int(6) | YES | | NULL | |
| sname | varchar(20) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
| gender | varchar(10) | YES | | 1 | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.004 sec)
MariaDB [mydb]> insert into stu(sid,sname,age) values(1,"張三",13);
Query OK, 1 row affected (0.008 sec)
MariaDB [mydb]> insert into stu values(2,"李四",15, "6");
Query OK, 1 row affected (0.007 sec)
MariaDB [mydb]> select * from stu;
+------+--------+------+--------+
| sid | sname | age | gender |
+------+--------+------+--------+
| 1 | 張三 | 13 | 1 |
| 2 | 李四 | 15 | 6 |
+------+--------+------+--------+
2 rows in set (0.002 sec)
6,外鍵約束
建立表與表之間的關係,外鍵的本質就是保存別的表中已存在的主鍵值。
constraint <自定義約束名稱> foreign key(<外鍵名稱>) references <關聯的表名>(關聯表的主鍵列名)
方式一:創建表時指定
create table stu(
sid int(6),
sname varchar(20),
age int(3),
gender varchar(10),
teacherid int(6),
constraint fk_tid foreign key(teacherid) references teacher(tid)
);
MariaDB [mydb]> create table teacher(
-> tid int(6) primary key,
-> tname varchar(20)
-> );
Query OK, 0 rows affected (0.028 sec)
MariaDB [mydb]> create table stu(
-> sid int(6),
-> sname varchar(20),
-> age int(3),
-> gender varchar(10),
-> teacherid int(6),
->
-> constraint fk_tid foreign key(teacherid) references teacher(tid)
-> );
Query OK, 0 rows affected (0.101 sec)
MariaDB [mydb]> desc stu;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| sid | int(6) | YES | | NULL | |
| sname | varchar(20) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
| gender | varchar(10) | YES | | NULL | |
| teacherid | int(6) | YES | MUL | NULL | |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.004 sec)
MariaDB [mydb]> desc teacher;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| tid | int(6) | NO | PRI | NULL | |
| tname | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.003 sec)
MariaDB [mydb]> insert into teacher values(1,"李老師");
Query OK, 1 row affected (0.015 sec)
MariaDB [mydb]> insert into stu values(4, "張三", 16, "5", 3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydb`.`stu`, CONSTRAINT `fk_tid` FOREIGN KEY (`teacherid`) REFERENCES `teacher` (`tid`))
MariaDB [mydb]> insert into stu values(4, "張三", 16, "5", 1);
Query OK, 1 row affected (0.007 sec)
方式二:修改表時添加外鍵約束
alter table <表名> add constraint <自定義約束名稱> foreign key(<外鍵名稱>) references <關聯的表名>(關聯表的主鍵列名)
MariaDB [mydb]> alter table stu add constraint fk_tid foreign key(teacherid) references teacher(tid);
Query OK, 0 rows affected (0.091 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [mydb]> insert into stu values(4, "張三", 16, "5", 100);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydb`.`stu`, CONSTRAINT `fk_tid` FOREIGN KEY (`teacherid`) REFERENCES `teacher` (`tid`))
MariaDB [mydb]> insert into stu values(4, "張三", 16, "5", 1);
Query OK, 1 row affected (0.007 sec)
方式三:修改表時刪除外鍵約束
alter table <表名> drop foreign key <外鍵名稱>;
MariaDB [mydb]> alter table stu drop foreign key fk_tid;
Query OK, 0 rows affected (0.012 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [mydb]> insert into stu values(4, "張三", 16, "5", 100);
Query OK, 1 row affected (0.007 sec)