gpt4 book ai didi

mysql - 如何使列不为空并成为 MySQL 中的外键

转载 作者:行者123 更新时间:2023-11-29 21:58:58 25 4
gpt4 key购买 nike

我正在尝试创建一个作为另一个表的外键的表并使其不为空,但我在实现这两种情况时遇到了麻烦。我能够成功地使不需要 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com