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

如何使列不为null并成为MySQL中的外键,mysql,Mysql,我试图创建一个表,该表是另一个表的外键,并使其不为null,但在实现这两个目标时遇到了麻烦。我能够成功地使外键工作,不需要NOTNULL,但我不能使两者都工作 这是给我带来麻烦的电话线 CONSTRAINT instructor FOREIGN KEY (id) REFERENCES Instructor(id) NOT NULL 然后我得到一个错误: CONSTRAINT instructor FOREIGN KEY (id) REFERENCES Instructor(id) NOT NU

我试图创建一个表,该表是另一个表的外键,并使其不为null,但在实现这两个目标时遇到了麻烦。我能够成功地使外键工作,不需要NOTNULL,但我不能使两者都工作

这是给我带来麻烦的电话线

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_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
);
一般来说,这更有意义。您正在为预先存在的课程和预先存在的娱乐中心成员创建新的注册记录,并记录其成本


语法图与实际行为 如果,正如-我没有任何理由不相信他的话-MySQL能够识别但不响应语句中列定义中的
引用
子句,而只对完整的
外键
子句进行操作,然后,您必须将我的建议答案从语法正确但语义被忽略的形式调整为类似:

选项1(从问题中最少更改SQL):

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

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

重点
必须先定义列,然后才能基于这些列定义外键。

在尝试对列创建约束之前,需要先创建列

你有:

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_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
);
一般来说,这更有意义。您正在为预先存在的课程和预先存在的娱乐中心成员创建新的注册记录,并记录其成本


语法图与实际行为 如果,正如-我没有任何理由不相信他的话-MySQL能够识别但不响应语句中列定义中的
引用
子句,而只对完整的
外键
子句进行操作,然后,您必须将我的建议答案从语法正确但语义被忽略的形式调整为类似:

选项1(从问题中最少更改SQL):

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

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

重点
必须先定义列,然后才能基于这些列定义外键。

在使用约束之前需要定义字段。同样的字段,尤其是一个命名id,也不太可能引用其他两个表。在使用约束之前,需要定义字段。同样的字段,尤其是一个命名id,也不太可能引用其他两个表。谢谢你的帮助。别让我开始说这一切有多不寻常。。。这是给一个坏教授上课的。当我创建表并使用“descripe TableName”时,没有任何外键列显示,并且我无法使用外键collumns手动插入。您知道如何执行此操作吗?嗯,您必须在类表和RecCenterMember表中插入适当的行,然后才能插入到注册表中。而且,如果注册中的ID值是自动生成的,那么您必须预测注册中将生成什么值,以便在类和RecCenterMember中插入正确的值-如果系统运行时多个用户同时添加内容,这有点棘手。你确定你不需要
class\u id INT NOT NULL REFERENCES class(id)
member\u id INT NOT NULL REFERENCES RecCenterMember(id)
?由于家庭作业的限制,我正在手动填充数据库(手动复制word中的表格),当我尝试用外键插入表时,如下所示:插入RecCenterMember(f_name,l_name,dob,family_id)值('Abby','Smith','5/21/1983',(从FamilyPackage中选择id,其中id=1));我得到一个错误,说family_id是无效的标识符,尽管family_id实际上是我试图插入的列的名称into@Jonathan