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

标签 mysql

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

相关文章:

php - 调用时在列表框中显示列表框中存储的值

mysql - 当我更改mysql数据库时,我失去了权限

php - 存储大量文本数据的最佳方式是什么? Mysql/Json 文件?

MySQL 日期的多个 if 语句

php - 连接两个以上的 mysql 表,然后将行操作为分组的多维数组

php - 我想使用 PDO 将数据更新到数据库,但数据库中没有任何变化

php - 使用 PHP 将嵌套数组插入 MySQL 数据库

mysql - 连接两个工作表;第一个包含范围列表,第二个包含可能属于第一个范围内的数据

php - Laravel 5 Eloquent 地查询半正矢公式

sql - 使用从另一列计算的值更新多行