如何使列不为null并成为MySQL中的外键

时间:2015-09-29 22:37:15

标签: mysql

我正在尝试创建一个表,它是另一个表的外键并使其不为null,但是我遇到了麻烦,两者都发生了。我能够成功地获得不需要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

如何修复这两个错误?

1 个答案:

答案 0 :(得分:0)

在尝试在列上创建约束之前,您需要创建列。

你有:

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
);

请注意,在第一行中,不需要FOREIGN KEY,因为该列是隐含的。在第二行中,标识了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_INCREMENT等。

也许你真的在追求:

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
);

这一般更有意义。您正在为预先存在的班级和预先存在的娱乐中心成员创建新的登记记录,并记录其成本。

语法图与实际行为

如果Michael - sqlbot suggests - 并且我没有任何理由不相信他 - MySQL会识别但不响应REFERENCES中的列FOREIGN KEY子句3}}语句但只对完整的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 ); 子句起作用,那么你必须将我建议的答案从语法正确但语义上被忽略的形式调整为:

选项1(最小化问题中的SQL):

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
);

选项2(我认为最合理的版本):

<receiver android:name="redacted.TheBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE"></action>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

或者此语法的其他一些变体基于忽略FK约束的所需表模式,然后沿着显示的行添加约束。

关键点

在根据这些列定义外键之前,必须先定义列。