在MySQL中实现完整性约束时,需要注意的几点:一、确保数据类型正确;二、使用适当的检查函数;三、处理可能出现的异常。
以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。
-- 创建 student1 表
CREATE TABLE student1 (
Sno CHAR(5) PRIMARY KEY,
Sname VARCHAR(20) NOT NULL,
Sage INT,
Ssex ENUM('男', '女'),
CONSTRAINT CK_Sno CHECK (Sno LIKE '9_____')
-- MySQL 中使用 '_' 匹配单个字符
CONSTRAINT CK_Sage CHECK (Sage < 30)
);
-- 创建 course1 表
CREATE TABLE course1 (
Cno CHAR(4) PRIMARY KEY,
Cname VARCHAR(40) NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES course1(Cno)
);
-- 创建 sc1 表
CREATE TABLE sc1 (
Sno CHAR(5),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES student1(Sno),
FOREIGN KEY (Cno) REFERENCES course1(Cno)
);
-- 修改 student1 表的完整性约束
ALTER TABLE student1
DROP CONSTRAINT CK_Ssex,
DROP CONSTRAINT CK_Sage,
ADD CONSTRAINT CK_Sage CHECK (Sage < 40);
MySQL 语法变更说明:
ENUM 数据类型: 为了限制 Ssex 列只能取 '男' 或 '女',使用了 ENUM 数据类型,它只能存储枚举列表中的一个值。
LIKE 通配符: 在 CK_Sno 约束中,使用 _ (下划线) 通配符来匹配单个字符,而不是 SQL Server 中的 %。
约束命名: MySQL 默认不启用 CHECK 约束,因此添加 CHECK 约束时可以省略约束名。但为了保持代码一致性,这里仍然保留了约束名。
其他部分与 SQL Server 语法基本一致. 请注意,虽然 MySQL 不启用 CHECK 约束,但仍然会解析它们,因此在创建表时不会报错。