我正在尝试创建一个作为另一个表的外键的表并使其不为空,但我在实现这两种情况时遇到了麻烦。我能够成功地使不需要 NOT NULL 的外键工作,但我无法同时工作。
这是给我带来麻烦的行
CONSTRAINT instructor FOREIGN KEY (id) REFERENCES Instructor(id) NOT NULL
然后我收到错误:
CONSTRAINT instructor FOREIGN KEY (id) REFERENCES Instructor(id) NOT NULL,
*
ERROR at line 5:
ORA-00907: missing right parenthesis
另外,我在尝试创建一个表时遇到了一个奇怪的错误(注意,该表是在创建包含上述错误的表后创建的),它在一个非常微不足道的部分失败了:
CREATE TABLE Enrollment (
CONSTRAINT class_id FOREIGN KEY (id) REFERENCES Class(id) NOT NULL,
CONSTRAINT member_id FOREIGN KEY (id) REFERENCES RecCenterMember(id) NOT NULL,
cost int NOT NULL
);
然后对于该命令我收到此错误:
CREATE TABLE Enrollment (
*
ERROR at line 1:
ORA-00904: : invalid identifier
如何修复这两个错误?
最佳答案
您需要先创建列,然后再尝试在列上创建约束。
你有:
CREATE TABLE Enrollment (
CONSTRAINT class_id FOREIGN KEY (id) REFERENCES Class(id) NOT NULL,
CONSTRAINT member_id FOREIGN KEY (id) REFERENCES RecCenterMember(id) NOT NULL,
cost int NOT NULL
);
您需要:
CREATE TABLE Enrollment (
id INT NOT NULL CONSTRAINT class_id REFERENCES Class(id),
CONSTRAINT member_id FOREIGN KEY (id) REFERENCES RecCenterMember(id),
cost INT NOT NULL
);
请注意,在第一行中,外键不是必需的,因为该列是隐含的。在第二行中,标识了id
。你也可以这样写:
CREATE TABLE Enrollment
(
id INT NOT NULL,
CONSTRAINT class_id FOREIGN KEY (id) REFERENCES Class(id),
CONSTRAINT member_id FOREIGN KEY (id) REFERENCES RecCenterMember(id),
cost INT NOT NULL
);
将单个列 (id
) 同时作为两个表的外键是不常见的,但并非自动错误。目前尚不清楚您是否真的希望表中包含三列 - 如果需要,表中包含哪些列名称。
您还可以在 MySQL 语法中为自动分配类型使用适当的表示法(SERIAL
而不是 INT NOT NULL
,或添加 AUTO_INCRMENT
等)。
也许你真正追求的是:
CREATE TABLE Enrollment
(
id SERIAL,
class_id INT NOT NULL CONSTRAINT class_id REFERENCES Class(id),
member_id INT NOT NULL CONSTRAINT member_id REFERENCES RecCenterMember(id),
cost INT NOT NULL
);
这通常更有意义。您正在为现有类(class)和现有娱乐中心成员(member)创建新的注册记录,并记录其费用。
<小时/>语法图与实际行为
如果,如Michael - sqlbot suggests — 我没有任何理由不相信他 — MySQL 识别但不响应 CREATE TABLE 中列定义中的 REFERENCES
子句语句,但仅作用于完整的 FOREIGN KEY
子句,那么您必须将我建议的答案从语法正确但语义忽略的形式调整为:
选项 1(最小程度地更改问题中的 SQL):
CREATE TABLE Enrollment (
id INT NOT NULL,
CONSTRAINT class_id FOREIGN KEY (id) REFERENCES Class(id),
CONSTRAINT member_id FOREIGN KEY (id) REFERENCES RecCenterMember(id),
cost int NOT NULL
);
选项 2(我认为最合理的版本):
CREATE TABLE Enrollment
(
id SERIAL,
class_id INT NOT NULL,
CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES Class(id),
member_id INT NOT NULL,
CONSTRAINT fk_member_id FOREIGN KEY (member_id) REFERENCES RecCenterMember(id),
cost INT NOT NULL
);
或者此语法的其他一些变体,基于所需的表模式,忽略 FK 约束,然后沿着所示的行添加约束。
要点
您必须先定义这些列,然后才能根据这些列定义外键。
关于mysql - 如何使列不为空并成为 MySQL 中的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32854890/