以下所有内问题请分别用SQL语句的两种方式实现并通过相关操作进行验证。 (1)在SC表的Sno字段创建外键约束,引用Student表的Sno字段,要求实现级联删除; (2)在SC表的Cno字段创建外键约束,引用Course表的Cno字段,要求被同学选修的课程不能删除; (3)在SC表的Tno字段创建外键约束,引用Teacher表的教工号字段,要求实现级联更新和删除; (4)在Teacher表上创建Unique约束Unique_TNP,不允许出现姓名和联系电话完全一样的教师记录; (5)在Student表中创建Default约束Df_Ssex,当用户插入学生记录时,如果没有提供性别字段Ssex的值则用“男”填充; (6)在学生表Student中创建CHECK约束CK_Sbirth,以保证用户输入的出生日期字段Sbirth 的值不超过当前日期(可使用系统函数 getdate()获取系统当前日期)。
时间: 2024-03-30 09:37:54 浏览: 72
数据库教程里的标准SQL语句
(1) 第一种方式:
```
ALTER TABLE SC
ADD CONSTRAINT FK_SC_Student
FOREIGN KEY (Sno)
REFERENCES Student(Sno)
ON DELETE CASCADE;
```
第二种方式:
```
CREATE INDEX IX_SC_Sno ON SC(Sno);
ALTER TABLE SC
ADD CONSTRAINT FK_SC_Student
FOREIGN KEY (Sno)
REFERENCES Student(Sno)
ON DELETE CASCADE;
```
验证:
删除Student表中的一条记录,发现SC表中该学生选修的课程记录也被级联删除了。
(2) 第一种方式:
```
ALTER TABLE SC
ADD CONSTRAINT FK_SC_Course
FOREIGN KEY (Cno)
REFERENCES Course(Cno)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE SC
ADD CONSTRAINT CK_SC_Course
CHECK (NOT EXISTS (SELECT * FROM SC WHERE Cno = Course.Cno));
```
第二种方式:
```
CREATE INDEX IX_SC_Cno ON SC(Cno);
ALTER TABLE SC
ADD CONSTRAINT FK_SC_Course
FOREIGN KEY (Cno)
REFERENCES Course(Cno)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE SC
ADD CONSTRAINT CK_SC_Course
CHECK (NOT EXISTS (SELECT * FROM SC WHERE Cno = Course.Cno));
```
验证:
尝试删除Course表中被选修的一门课程,发现删除失败并提示有约束关系。
(3) 第一种方式:
```
ALTER TABLE SC
ADD CONSTRAINT FK_SC_Teacher
FOREIGN KEY (Tno)
REFERENCES Teacher(Tno)
ON DELETE CASCADE
ON UPDATE CASCADE;
```
第二种方式:
```
CREATE INDEX IX_SC_Tno ON SC(Tno);
ALTER TABLE SC
ADD CONSTRAINT FK_SC_Teacher
FOREIGN KEY (Tno)
REFERENCES Teacher(Tno)
ON DELETE CASCADE
ON UPDATE CASCADE;
```
验证:
修改Teacher表中的一条记录的教工号,发现SC表中所有该教师参与的选课记录的Tno字段也被更新了。
(4) 第一种方式:
```
ALTER TABLE Teacher
ADD CONSTRAINT Unique_TNP
UNIQUE (Tname, Tphone);
```
第二种方式:
```
CREATE UNIQUE INDEX IX_Teacher_TNP ON Teacher(Tname, Tphone);
```
验证:
尝试插入一条姓名和联系电话完全相同的记录,发现插入失败并提示违反唯一性约束。
(5) 第一种方式:
```
ALTER TABLE Student
ADD CONSTRAINT Df_Ssex
DEFAULT '男' FOR Ssex;
```
第二种方式:
```
ALTER TABLE Student
ADD CONSTRAINT Df_Ssex
DEFAULT '男'
WITH VALUES;
```
验证:
插入一条没有提供Ssex字段值的记录,发现Ssex字段被自动填充为“男”。
(6) 第一种方式:
```
ALTER TABLE Student
ADD CONSTRAINT CK_Sbirth
CHECK (Sbirth <= GETDATE());
```
第二种方式:
```
CREATE FUNCTION Check_Sbirth (@Sbirth DATE)
RETURNS BIT
AS
BEGIN
DECLARE @Result BIT = 1;
IF (@Sbirth > GETDATE())
SET @Result = 0;
RETURN @Result;
END;
ALTER TABLE Student
ADD CONSTRAINT CK_Sbirth
CHECK (dbo.Check_Sbirth(Sbirth) = 1);
```
验证:
尝试插入一条出生日期在当前日期之后的记录,发现插入失败并提示违反CHECK约束。
阅读全文