数据表管理


定义数据栏位有几个约束情况。

主键约束

对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。

对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。

作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:

使用关键字PRIMARY KEY,设定数据表的栏位为主键。下面的命令表示创建一个数据表tearcher,并设置其id栏位为主键。

                    mysql> CREATE TABLE teacher(id bigint PRIMARY KEY);
                    Query OK, 0 rows affected (0.07 sec)
                

非空约束

使用关键字NOT NULL,设置数据表栏位不为空。

                    mysql> ALTER TABLE teacher ADD COLUMN name VARCHAR(20) NOT NULL;
                    Query OK, 0 rows affected (0.12 sec)
                    Records: 0  Duplicates: 0  Warnings: 0
                

上述命令修改teacher数据表,添加一个栏位name,不允许栏位信息为空。

DEFAULT约束

使用关键字DEFAULT,设置数据表栏位的默认值。

                    mysql> ALTER TABLE teacher ADD COLUMN age int NOT NULL DEFAULT 0;
                    Query OK, 0 rows affected (0.05 sec)
                    Records: 0  Duplicates: 0  Warnings: 0
                

上述命令修改teacher数据表,添加一个栏位age,其默认值是0。

检查约束

使用关键字CHECK,设置数据表栏位检查约束。

                    ALTER TABLE <表名> ADD CONSTRAINT <约束名> CHECK <条件表达式>;
                
                    mysql> ALTER TABLE teacher ADD CONSTRAINT agecheck CHECK (age>22 and age<100);
                    Query OK, 0 rows affected (0.11 sec)
                    Records: 0  Duplicates: 0  Warnings: 0
                

上述命令修改teacher数据表,添加一个检查约束设置age在22岁到100岁之间。

使用SHOW CREATE TABLE命令查看添加的约束信息。

                    mysql> SHOW CREATE TABLE teacher\G;
                    *************************** 1. row ***************************
                        Table: teacher
                    Create Table: CREATE TABLE `teacher` (
                    `id` bigint NOT NULL,
                    `name` varchar(20) NOT NULL,
                    `age` int NOT NULL DEFAULT '0',
                    PRIMARY KEY (`id`),
                    CONSTRAINT `agecheck` CHECK (((`age` > 22) and (`age` < 100)))
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
                    1 row in set (0.00 sec)
                

唯一约束

使用关键字UNIQUE KEY,设置数据表栏位的每一条记录都是唯一的。

                    mysql> ALTER TABLE teacher ADD COLUMN idCard VARCHAR(20) NOT NULL UNIQUE KEY;
                    Query OK, 0 rows affected (0.13 sec)
                    Records: 0  Duplicates: 0  Warnings: 0
                

使用SHOW CREATE TABLE命令查看添加的idCard栏位及其唯一约束

                    mysql> SHOW CREATE TABLE teacher\G
                    *************************** 1. row ***************************
                        Table: teacher
                    Create Table: CREATE TABLE `teacher` (
                    `id` bigint NOT NULL,
                    `name` varchar(20) NOT NULL,
                    `age` int NOT NULL DEFAULT '0',
                    `idCard` varchar(20) NOT NULL,
                    PRIMARY KEY (`id`),
                    UNIQUE KEY `idCard` (`idCard`),
                    CONSTRAINT `agecheck` CHECK (((`age` > 22) and (`age` < 100)))
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
                    1 row in set (0.00 sec)
                

外键约束

使用FOREIGN KEY关键字设置外键,REFERENCES 关键字参考表和栏位。

                    ALTER TABLE <表名> ADD CONSTRAINT <外键名称> FOREIGN KEY (<栏位>) REFERENCES <参考表>(<栏位>);
                
                    mysql> ALTER TABLE student ADD CONSTRAINT classFK FOREIGN KEY (classId) REFERENCES class(id);
                    Query OK, 0 rows affected (0.13 sec)>
                    Records: 0  Duplicates: 0  Warnings: 0
                

上述命令给student表添加一个外键classId,其参考表为class,参考栏位为id。