sql - MS SQL 中的外键引用无效列错误
问题描述
这一切都在 MS SQL 中。
我已经看到这个问题弹出了很多,我四处搜索,但我仍然无法弄清楚我的问题。我收到错误消息,告诉我我在未创建表的无效列中的外键引用。但是,我创建了该表,因为它显示在我的数据库表列表中,因此它显示它已创建。
我试图将该表移到引用它的表上方,但我仍然收到错误消息。有人知道如何解决这个问题吗?
我的代码:
CREATE SCHEMA usr_in;
go
CREATE TABLE gender_interst (
id int IDENTITY (1,1),
gend_id int
CONSTRAINT gender_interstpk PRIMARY KEY (id)
)
CREATE TABLE gender (
id int IDENTITY (1,1),
gend VARCHAR (20)
CONSTRAINT genderpk PRIMARY KEY (id)
);
SELECT * FROM gender_interst LEFT JOIN gender on gender_interst.id = gender.id;
SELECT * from gender_interst;
CREATE TABLE user_info (
id int PRIMARY KEY IDENTITY (1,1),
usr_name VARCHAR (30) NOT NULL,
f_name VARCHAR (30) NOT NULL,
l_name VARCHAR (30),
b_day DATE,
email VARCHAR (120) NOT NULL,
genderpkid VARCHAR (10) NOT NULL,
CONSTRAINT gender_fk FOREIGN KEY (genderpkid) REFERENCES gender (genderpk),
);
INSERT
INTO user_info
( usr_name, f_name, l_name, b_day, genderpkid, email)
VALUES
('JMAN', 'JOHN', 'DOE', '1990-01-01','M','EX@EMAIL'),
('JAM','JANE', 'DOE', '1995-05-02','F','EX@EMAIL'),
('NMAN','NICK', 'WEBB', '1999-06-22','M','EX@EMAIL'),
('LOBA','LOLA', 'LILLY', '1994-01-08','F','EX@EMAIL'),
('NOTSPMAN','PETER', 'PARKER','1985-11-25','M','EX@EMAIL');
SELECT * FROM user_info;
解决方案
您的外键需要引用表列的名称(或者是id
or gend
)而不是主键的名称 ( genderpk
)。
因此外键脚本 ( CONSTRAINT gender_fk FOREIGN KEY (genderpkid) REFERENCES gender (genderpk)
) 应该类似于CONSTRAINT gender_fk FOREIGN KEY (genderpkid) REFERENCES gender (id)
但是,要创建关系,两列需要具有相同的数据类型。user_info .genderpkid
是VARCHAR (10)
和user_info.id
是int
。
您可能遇到的另一个问题是插入脚本将数据以或的形式插入到genderpkid
列中。因此 int 不起作用M
F
如果您要使用值 M 或 F 来表示性别,那么您可以创建如下脚本:
CREATE TABLE gender (
id VARCHAR (1),
gender VARCHAR (20)
CONSTRAINT gender_pk PRIMARY KEY (id)
);
CREATE TABLE user_info (
id int PRIMARY KEY IDENTITY (1,1),
usr_name VARCHAR (30) NOT NULL,
f_name VARCHAR (30) NOT NULL,
l_name VARCHAR (30),
b_day DATE,
email VARCHAR (120) NOT NULL,
genderId VARCHAR (1) NOT NULL,
CONSTRAINT gender_fk FOREIGN KEY (genderId) REFERENCES gender (id),
);
INSERT INTO gender (id, gender)
VALUES
('F', 'Female'),
('M', 'Male')
INSERT
INTO user_info
( usr_name, f_name, l_name, b_day, genderId, email)
VALUES
('JMAN', 'JOHN', 'DOE', '1990-01-01','M','EX@EMAIL'),
('JAM','JANE', 'DOE', '1995-05-02','F','EX@EMAIL'),
('NMAN','NICK', 'WEBB', '1999-06-22','M','EX@EMAIL'),
('LOBA','LOLA', 'LILLY', '1994-01-08','F','EX@EMAIL'),
('NOTSPMAN','PETER', 'PARKER','1985-11-25','M','EX@EMAIL');
SELECT * FROM user_info;
更好的方法可能是将整个短语(男性/女性)传递给桌子user_info
。该表gender
可用于强制执行referential integrity
。然后,您的所有信息都包含在SELECT * FROM user_info
例如:
CREATE TABLE gender (
[name] VARCHAR (20)
CONSTRAINT gender_pk PRIMARY KEY ([name])
);
CREATE TABLE user_info (
id int PRIMARY KEY IDENTITY (1,1),
usr_name VARCHAR (30) NOT NULL,
f_name VARCHAR (30) NOT NULL,
l_name VARCHAR (30),
b_day DATE,
email VARCHAR (120) NOT NULL,
gender VARCHAR (20) NOT NULL,
genderIntrest VARCHAR (20) NOT NULL,
CONSTRAINT gender_fk FOREIGN KEY (gender) REFERENCES gender ([name]),
CONSTRAINT genderIntrest_fk FOREIGN KEY (genderIntrest) REFERENCES gender ([name]),
);
INSERT INTO gender ([name])
VALUES
('Female'),
('Male')
INSERT
INTO user_info
( usr_name, f_name, l_name, b_day, gender, genderIntrest, email)
VALUES
('JMAN', 'JOHN', 'DOE', '1990-01-01','Male','Female', 'EX@EMAIL'),
('JAM','JANE', 'DOE', '1995-05-02','Female','Female', 'EX@EMAIL'),
('NMAN','NICK', 'WEBB', '1999-06-22','Male','Female','EX@EMAIL'),
('LOBA','LOLA', 'LILLY', '1994-01-08','Female','Female','EX@EMAIL'),
('NOTSPMAN','PETER', 'PARKER','1985-11-25','Male','Female','EX@EMAIL');
SELECT * FROM user_info;
您可以删除性别表并让使用它的应用程序传入数据。但是对于学习练习,最好将其留在
推荐阅读
- python - 使用请求库 python 登录
- azure-ad-b2c - 如何使用 AD B2C 自动化获取带有自定义声明的令牌
- c++ - 为什么文本文件中的字符串没有添加到我的字符串数组中?
- python - 如何将一个类的变量的值传递给另一个类?
- javascript - 如何将自定义主题 js 文件合并到 Nuxt
- libvirt - 如何使用 libvirt 将 macvtap 接口传递给 lxc 容器
- isis - 在 Apache ISIS 中执行报告“.jasper”时出现问题
- selenium - Xpath extract 从内容中提取值
- flutter - Flutter Image Widget 不会在更改状态时更新
- azure - 用于容器 WebSocket 的 Azure WebApp 不工作 - SAFE / ElmishBridge