sql - 单个字段是否包含来自不同表的多个外键关系[SQL]

标签 sql sql-server

我有 3 个表 Student,Teacher,User

学生:

CREATE TABLE Student( id INT NOT NULL PRIMARY KEY,name VARCHAR(50) NOT NULL);
INSERT INTO [dbo].[Student]([id],[name]) VALUES(4,'Ram'),(5,'Raman');

老师:

CREATE TABLE Teacher( id INT NOT NULL PRIMARY KEY,name VARCHAR(50) NOT NULL);
INSERT INTO [dbo].[Student]([id],[name]) VALUES(1,'Raj'),(2,'Rahul');

用户:

CREATE TABLE [dbo].[User](
    id INT NOT NULL PRIMARY KEY,
    user_id INT NOT NULL,
    user_type CHAR(1) NOT NULL,
    user_name VARCHAR(10) NOT NULL,
    user_password VARCHAR(255) NOT NULL,

    CONSTRAINT  FOREIGN KEY (user_id) REFERENCES Student (id),
    CONSTRAINT  FOREIGN KEY (user_id) REFERENCES Teacher (id) );

现在我尝试使用以下查询在 User 表中 INSERT

INSERT INTO [dbo].[User] ([id] ,[user_id]  ,[user_type],[user_name] ,[user_password])   VALUES  (1 ,1,'S','Raj_001','********')

由于 violation of foreign key 给我错误 user_id 的值在 Teacher 中可用,在 Student 中不可用

所以我的问题是:我怎样才能实现 user_id 的值出现在其中一个表中,并且数据应该插入到 User 表中。

最佳答案

您的表结构有缺陷。外键告诉数据库在关系的一侧肯定只有一行。你不能有部分匹配,全有或全无。这是在考虑如何确保最终不会在教师表和学生表中使用相同的 ID 之前。

最好在你的用户表中有两列,一列是教师编号,一列是学生编号。事实上,考虑到学生和教师表中唯一的额外数据是他们的名字,为什么不把两者都删除并将名字存储在用户表中呢?

要考虑的另一种选择是您的外键指向错误的方向。也许更好的方法是将其颠倒过来,以确保每个学生和教师都是用户,而不是用户既是学生又是教师。

关于sql - 单个字段是否包含来自不同表的多个外键关系[SQL],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58317662/

相关文章:

sql-server - varchar 和 nvarchar SQL Server 数据类型之间的主要性能差异是什么?

mysql - 如何在每个作业结束时在 talend 中实现日志记录?

sql - 如何在Oracle中获取 "Open"XML数据

sql - 同时更新列中的多个字段 Microsoft Access

sql - 使用 Oracle 应用程序显示图像输出

sql - 按级别连接不随每行字段的变化而调整

c# - 如何执行参数化 SQL 查询(使用带@变量的 LIKE)

sql - 如何报告 SQL Server 用户定义函数的错误

sql - 如何使用正确的文件扩展名将(所有)SQL Server 图像数据类型保存到文件系统

php - 使用 php 给下拉列表一个默认值