【筆記七】:數據約束

目錄

1,主鍵約束

2,主鍵自增長約束

3,非空約束

4,唯一約束

5,默認值約束

6,外鍵約束


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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章