如何在MYSQL中添加约束,使列仅保留已经存在于同一表的另一列中的值?
如何在MYSQL中添加约束,使列仅保留已经存在于同一表的另一列中的值?
这是我应该创建的表格:
表格
在Manager_ID
列中,我应该添加一个约束,但我不确定如何做。
这是我的代码:
CREATE TABLE CANDIDATE
(
Candidate_ID FLOAT(6) PRIMARY KEY,
Candidate_Name VARCHAR(20) NOT NULL,
Candidate_Email VARCHAR(30) UNIQUE,
Candidate_Dept CHAR(2) DEFAULT 'HR',
Manager_ID VARCHAR(30),
CONSTRAINT CHECK (Candidate_Email LIKE '%@%.%'),
CONSTRAINT CHECK (Manager_ID IN (SELECT DISTINCT Candidate_ID FROM CANDIDATE))
);
可以有人帮我添加必要的语句来完成上述任务吗?
问题的原因是想要在MySQL中为一个列添加约束,使该列只能包含已经存在于同一表的另一列中的值。而解决方法是使用外键约束(foreign key constraint)。
在MySQL中,可以通过以下语法来添加外键约束:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 外键表名(外键列名);
其中,表名
是要添加外键约束的表名,约束名
是给外键约束起的名称,列名
是要添加外键约束的列名,外键表名
是被参考的表名,外键列名
是被参考表中的列名。
对于这个问题,可以通过以下步骤来解决:
1. 首先,确定需要添加外键约束的表和列名。假设要为表中的manager_id
列添加约束,这个列的值必须存在于同一表的candidate_id
列中。
2. 使用ALTER TABLE
语句来添加外键约束。语句如下:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (manager_id) REFERENCES 表名(candidate_id);
其中,表名
是要添加外键约束的表名,约束名
是给外键约束起的名称,manager_id
是要添加约束的列名,表名(candidate_id)
表示参考表的名称和被参考列的名称。
3. 执行以上语句后,MySQL会自动创建外键约束,确保manager_id
列中的值只能是candidate_id
列中已经存在的值。
通过以上步骤,可以在MySQL中为一个列添加约束,使该列只能包含已经存在于同一表的另一列中的值。
问题的原因是作者混淆了CHECK约束和FOREIGN KEY约束。作者在代码中使用了CHECK约束来限制Candidate_Dept列的值必须存在于同一表的另一列中,这是不正确的。正确的方法是使用FOREIGN KEY约束来实现这个限制。
解决方法是将第二个约束改为FOREIGN KEY约束,代码如下:
CREATE TABLE CANDIDATE ( Candidate_ID INT PRIMARY KEY, Candidate_Name VARCHAR(20) NOT NULL, Candidate_Email VARCHAR(30) UNIQUE, Candidate_Dept VARCHAR(20) DEFAULT 'HR', Manager_ID INT, CONSTRAINT CHECK (Candidate_Email LIKE '%@%.%'), CONSTRAINT fk_candidate_manager_id FOREIGN KEY (Manager_ID) REFERENCES CANDIDATE(Candidate_ID) );
此外,作者在定义Candidate_Dept列时将数据类型设置为FLOAT(2),并将默认值设置为'HR',这是不正确的。'HR'不是一个有效的浮点数值,应该使用字符串类型。另外,主键应该避免使用浮点数值。
最后,作者对于FOREIGN KEY的使用方式表示不了解,对此给出了感谢。
作者在MYSQL中遇到了错误,但没有提供具体的错误信息。