SQL,创建表时,级联删除,动态索引,Student表中主键Sno是SC表中的Sno的外键,当Student主表主键Sno改变,SC表的外键Sno跟着改变 举例,给出SQL语句
时间: 2024-10-20 08:13:19 浏览: 21
在SQL中,当你需要创建一个表,并且希望在一个表(如SC表)中的外键引用另一个表(如Student表)的主键时,可以设置级联删除(CASCADE DELETE)。这样,如果在Student表中删除了一个学生记录,与其关联的所有SC表记录也会自动被删除,以保持数据的一致性。
例如,在创建Student表时,你可以这样定义:
```sql
CREATE TABLE Student (
Sno INT PRIMARY KEY,
Name VARCHAR(50),
-- 其他字段...
);
CREATE TABLE SC (
Sno INT,
CourseID INT,
Score DECIMAL(3,1),
FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE
);
```
在这个例子中,`FOREIGN KEY (Sno) REFERENCES Student(Sno)` 表示SC表的Sno列是Student表Sno列的外键,`ON DELETE CASCADE`指定了删除操作时的行为(级联删除)。
现在假设你想在Student表中修改主键Sno,由于设置了级联删除,相关的SC表记录会自动调整,因为它们的外键引用了新的Sno值。但是,这通常不建议直接修改已经存在的主键值,因为它可能会破坏数据库结构的完整性,除非有充分的理由并进行适当的迁移处理。
相关问题
在数据库st中3个表Student,SC和Course,表SC的字段sno作为外键与表Student连接。如果要删除表Student中的记录需要创建触发器, -- 先删除表SC中与要删除的记录级联的全部记录,再删除表Student中的记录。
是的,您所描述的情况需要创建一个触发器来实现级联删除。下面是一个MySQL触发器的示例代码,可以在删除Student表中的记录时自动删除与该记录相关的SC表中的记录:
```
CREATE TRIGGER delete_student
BEFORE DELETE ON Student
FOR EACH ROW
BEGIN
DELETE FROM SC WHERE sno = OLD.sno;
END;
```
在这个触发器中,我们使用了`OLD.sno`来引用将要删除的学生记录的sno值,然后使用`DELETE`语句删除SC表中与该sno相关的所有记录。这样,在删除Student表中的记录时,就会自动地删除SC表中与该记录相关的全部记录,从而实现了级联删除的效果。
以下内容请分别用SQL语句的两种方式实现并通过相关操作进行验证。 (1)对实验中的几张表建立主键约束(对已创建了主键约束的,请删除后重建);(2)在SC表的Sno字段创建外键约束,引用Student表的Sno字段,要求实现级联删除;(3)在SC表的Cno字段创建外键约束,引用Course表的Cno字段,要求被同学选修的课程不能删除; (4)在SC表的Tno字段创建外键约束,引用Teacher表的教工号字段,要求实现级联更新和删除; (5)在Teacher表上创建Unique约束Unique_TNP,不允许出现姓名和联系电话完全一样的教师记录; (6)在Student表中创建Default约束Df_Ssex,当用户插入学生记录时,如果没有提供性别字段Ssex的值则用“男”填充; (7)在学生表Student中创建CHECK约束CK_Sbirth,以保证用户输入的出生日期字段Sbirth 的值不超过当前日期(可使用系统函数 getdate()获取系统当前日期)。
1. 创建主键约束:
方式一:
```
-- 对Student表的Sno字段创建主键约束
ALTER TABLE Student ADD CONSTRAINT PK_Student_Sno PRIMARY KEY (Sno);
-- 对Course表的Cno字段创建主键约束
ALTER TABLE Course ADD CONSTRAINT PK_Course_Cno PRIMARY KEY (Cno);
-- 对Teacher表的Tno字段创建主键约束
ALTER TABLE Teacher ADD CONSTRAINT PK_Teacher_Tno PRIMARY KEY (Tno);
-- 对SC表的Sno、Cno、Tno字段组成的联合主键创建主键约束
ALTER TABLE SC ADD CONSTRAINT PK_SC PRIMARY KEY (Sno, Cno, Tno);
```
方式二:
```
-- 对Student表的Sno字段创建主键约束
ALTER TABLE Student ADD CONSTRAINT PK_Student_Sno PRIMARY KEY CLUSTERED (Sno);
-- 对Course表的Cno字段创建主键约束
ALTER TABLE Course ADD CONSTRAINT PK_Course_Cno PRIMARY KEY CLUSTERED (Cno);
-- 对Teacher表的Tno字段创建主键约束
ALTER TABLE Teacher ADD CONSTRAINT PK_Teacher_Tno PRIMARY KEY CLUSTERED (Tno);
-- 对SC表的Sno、Cno、Tno字段组成的联合主键创建主键约束
ALTER TABLE SC ADD CONSTRAINT PK_SC PRIMARY KEY CLUSTERED (Sno, Cno, Tno);
```
2. 创建外键约束:
```
-- 在SC表的Sno字段创建外键约束,引用Student表的Sno字段,要求实现级联删除
ALTER TABLE SC ADD CONSTRAINT FK_SC_Sno FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE;
-- 在SC表的Cno字段创建外键约束,引用Course表的Cno字段,要求被同学选修的课程不能删除
ALTER TABLE SC ADD CONSTRAINT FK_SC_Cno FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE NO ACTION;
-- 在SC表的Tno字段创建外键约束,引用Teacher表的教工号字段,要求实现级联更新和删除
ALTER TABLE SC ADD CONSTRAINT FK_SC_Tno FOREIGN KEY (Tno) REFERENCES Teacher(Tno) ON UPDATE CASCADE ON DELETE CASCADE;
```
3. 创建Unique约束:
```
-- 在Teacher表上创建Unique约束Unique_TNP,不允许出现姓名和联系电话完全一样的教师记录
ALTER TABLE Teacher ADD CONSTRAINT Unique_TNP UNIQUE (Tname, Tphone);
```
4. 创建Default约束:
```
-- 在Student表中创建Default约束Df_Ssex,当用户插入学生记录时,如果没有提供性别字段Ssex的值则用“男”填充
ALTER TABLE Student ADD CONSTRAINT Df_Ssex DEFAULT '男' FOR Ssex;
```
5. 创建CHECK约束:
```
-- 在学生表Student中创建CHECK约束CK_Sbirth,以保证用户输入的出生日期字段Sbirth 的值不超过当前日期
ALTER TABLE Student ADD CONSTRAINT CK_Sbirth CHECK (Sbirth <= GETDATE());
```
阅读全文