我应该写FK,NULL还是NOT_NULL?

时间:2012-05-29 21:09:55

标签: null foreign-keys primary-key data-dictionary

我试图做一个数据字典并填充表(属性,Null,Type,length) 我得到的一张桌子就像

create table user(
    user_number(8),
    First_name varchar(30) not null,
    Last_name varchar(30) not null,
    DOB date not null,
    nationality varchar (30) not null,
    gender char (1) not null,
    address varchar(30) not null,
    Primary key(user_ID)
    foreign key(profile_ID)
);

当我开始在表格中描述它们时,它就像

______________________________________________________
| column name  |     NULL   |    key  |     type     |
|====================================================|
| user_ID      |     null   |    pk   |     varchar  |
| profile_ID   |     null   |    fk   |     varchar  |
|______________|____________|_________|______________|

我的问题是,将pk和amp;放在一起是否正确? fk为null? 或者我应该制作fk Not-Null?

1 个答案:

答案 0 :(得分:0)

我认为您对数据库中的主键,外键以及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 );

当然,您使用的确切语法完全取决于您要做的事情。在上面的示例中,将创建两个表,配置文件和用户。在users表中,id列是主键,profile_id列是引用profiles表的外键。注意如何在上面的列定义中定义外键(profile_id);这是必需的。此外,几乎所有数据库都允许您将PRIMARY KEY指定为列定义中的限定符。或者,您可以将其指定为约束,如下所示:

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    -- other columns and constraints...
    PRIMARY KEY (id) );

您可能想要使用该语法的主要原因是,如果您有一个多列主键 - 两个或多个列本身不一定是唯一的,而是组合在一起构成一个独特的组合。但这有点先进。

大多数数据库都不允许您拥有能够在其中包含空值的主键列。例如,在MySQL中,如果您没有明确地将主键列声明为NOT NULL,那么无论如何它都将默默地进行。如果您能够将主键列声明为具有空值,则只有一个记录可以为null - 多个空值将违反主键约束。

外键可以为null,但您可能不希望它们为null。这是外键的一点 - 作为对另一个表的数据的引用,并且您几乎总是希望表中的所有行都使用外键在另一个表中包含父数据。关于你想要一个空外键的唯一时间是你想要一个表包含“孤立”数据。在上面的示例中,如果用户可能没有将个人资料附加到他或她的帐户,则profile_id列可能为null。

我强烈建议您查找有关主键和外键的一些基本教程信息。它们并不是难以掌握的概念,但如果您在任何重要程度上使用数据库,那么您肯定需要了解它。我希望其中一些有所帮助,你会发现你想要做的事情。如果你有一个你想要完成的具体任务,发布它的内容可能会有所帮助,因为它更容易使用一个实际的例子,而不是从概念上解释它希望我所说的东西特别适用于你的'重新尝试。