我不认为您对数据库中的主键、外键以及 null 与非 null 的含义有什么密切的了解。或者至少,如果你这样做了,你没有使用正确的语法来描述你正在尝试做的事情。
大多数列定义包括名称、长度(有时)、数据类型和限定符,如 NULL/NOT NULL、AUTOINCREMEMT、PRIMARY KEY 等。此外,在所有列定义之后,大多数数据库都有特定的语法结构要定义约束,例如索引列、主键、唯一列等。请注意,主键列必须是上面在列定义中定义的列。
每个数据库的语法都有细微差别,但大多数都遵循相当一致的模式。例如,在 MySQL 中,您可能会定义几个表,如下所示:
CREATE TABLE profiles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(50) NOT NULL,
-- other fields
);
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
profile_id INTEGER NOT NULL,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
date_of_birth DATETIME NOT NULL,
nationality VARCHAR(30) NOT NULL,
gender CHAR(1) NOT NULL,
address VARCHAR(30) NOT NULL,
CONSTRAINT FOREIGN KEY (profile_id)
REFERENCES profiles (id)
ON UPDATE CASCADE
ON DELETE CASCADE );
当然,您使用的确切语法完全取决于您要执行的操作。在上面的示例中,将创建两个表,profiles 和 users。在 users 表中,id 列是主键,profile_id 列是引用配置文件表的外键。注意外键(profile_id)是如何在上面的列定义中定义的;这是必需的。此外,几乎所有数据库都允许您将 PRIMARY KEY 指定为列定义中的限定符。或者,您可以将其指定为约束,如下所示:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
-- other columns and constraints...
PRIMARY KEY (id) );
您可能想要使用该语法的主要原因是,如果您有一个多列主键 - 两个或更多列本身不一定是唯一的,但合在一起构成一个唯一组合。但这有点先进。
大多数数据库不允许您拥有能够在其中包含空值的主键列。例如,在 MySQL 中,如果您没有将主键列显式声明为 NOT NULL,那么无论如何它都会默默地这样做。如果您能够将主键列声明为能够具有空值,那么只有一条记录能够具有空值——多个空值将违反主键约束。
外键可以为空,但您可能不希望它们为空。这就是外键的意义——用作对另一个表数据的引用,并且您几乎总是希望表中具有外键的所有行都包含另一个表中的父数据。您唯一需要空外键的情况是您希望表包含“孤立”数据。在上面的示例中,如果用户可能没有将个人资料附加到他或她的帐户,则 profile_id 列可能为空。
我强烈建议寻找一些关于主键和外键的基本教程信息。它们不是很难掌握的概念,但如果您在任何重要程度上使用数据库,您肯定需要知道这一点。我希望这对您有所帮助,并且您会找到想要做的事情。如果您有要完成的具体任务,发布它可能会有所帮助,因为使用实际示例比从概念上解释它更容易,希望我所说的内容特别适用于您的内容重新尝试做。