我有 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/