如何向Microsoft SQL Server数据库中的现有表添加主键和外键

如何向Microsoft SQL Server数据库中的现有表添加主键和外键,sql,sql-server,database,Sql,Sql Server,Database,我已经创建了两个表,table123和items\u-ordered table123共有5列:customerid、firstname、姓氏、城市和州 订购的物品有5列客户ID,订购日期,物品,数量和价格 我想在customerid列的table123中创建一个主键,在customerid列的items\u ordered中创建一个外键 以下是我用来尝试创建主键和外键的代码: ALTER TABLE table123 ADD PRIMARY KEY (customerid); A

我已经创建了两个表,
table123
items\u-ordered

  • table123
    共有5列:
    customerid
    firstname
    姓氏
    城市

  • 订购的物品
    有5列
    客户ID
    订购日期
    物品
    数量
    价格

我想在
customerid
列的
table123
中创建一个主键,在
customerid
列的
items\u ordered
中创建一个外键

以下是我用来尝试创建主键和外键的代码:

ALTER TABLE table123
    ADD PRIMARY KEY (customerid);

ALTER TABLE items_ordered
    ADD FOREIGN KEY (customerid)
        REFERENCES table123 (customerid);
SELECT table123.customerid, table123.surname, 
       items_ordered.order_date, items_ordered.item, items_ordered.price
FROM table123, items_ordered
WHERE table123.customerid = items_ordered.customerid;
但是,当我执行这些命令时,它会说

无法在表“table123”中的可空列上定义主键约束

我怎样才能解决这个问题?表中也没有任何空值

另外,我已经尝试使用此替代方法创建主键和外键:

ALTER TABLE table123
    ADD PRIMARY KEY (customerid);

ALTER TABLE items_ordered
    ADD FOREIGN KEY (customerid)
        REFERENCES table123 (customerid);
SELECT table123.customerid, table123.surname, 
       items_ordered.order_date, items_ordered.item, items_ordered.price
FROM table123, items_ordered
WHERE table123.customerid = items_ordered.customerid;

上面的代码提供了一个表,将customerid链接到客户名称和购买的产品。但是这是创建主键和外键的正确方法吗?

当您试图在允许有空值的列上创建主键时,通常会发生这种情况。内容中可能没有任何空值,但定义仍然允许它们


将列定义更改为不允许空值

当您试图在允许有空值的列上创建主键时,通常会发生这种情况。内容中可能没有任何空值,但定义仍然允许它们

将列定义更改为不允许空值

你能试试这个吗

ALTER TABLE table123
ALTER COLUMN customerid INT NOT NULL
然后运行:

ALTER TABLE table123
ADD PRIMARY KEY (customerid)
那么

您需要将列定义更改为NOTNULL,并确保所有值都是唯一的

您能试试吗

ALTER TABLE table123
ALTER COLUMN customerid INT NOT NULL
然后运行:

ALTER TABLE table123
ADD PRIMARY KEY (customerid)
那么


您需要将列定义更改为NOTNULL,并确保所有值都是唯一的

好吧,错误说明了一切-您无法在可为空的列上创建主键-因此,请确保在
table123
的定义中,您有
CustomerId INT NOTNULL
-然后您可以定义主键。您的第二次尝试是有缺陷的,因为它应该使用正确的ANSI/ISO联接语法(而不是在
FROM
子句中列出以逗号分隔的表)-并且它不创建主键和/或外键-它只是在一个公共列上联接两个表,错误说明了一切-您无法在可空列上创建主键-因此请确保在
table123
的定义中,您有
CustomerId INT NOT NULL
-然后您可以定义主键。您的第二次尝试是有缺陷的,因为它应该使用正确的ANSI/ISO联接语法(而不是在
FROM
子句中列出以逗号分隔的表)-并且它不创建主键和/或外键-当您创建主键和外键时,它只在公共列上联接两个表,是否要创建另一个表?定义主键和外键不会创建新表,而是创建表之间的关系。其主要目的是确保数据的一致性;也可以对其他非主键/非外键列执行联接。如果创建的外键引用了另一个表的主键,例如
student(stud\u id,dept\u id)引用department(dept\u id,dept\u name)
,那么它要做的一件事就是确保不能在student表中插入一个没有dept id的条目。创建主键和外键时,是否要创建另一个表?定义主键和外键不会创建新表,而是创建表之间的关系。其主要目的是确保数据的一致性;也可以对其他非主键/非外键列执行联接。如果您创建一个外键,它引用另一个表的主键,例如
student(stud\u id,dept\u id)引用department(dept\u id,dept\u name)
,那么它要做的一件事就是确保您不能在student表中插入一个没有dept id的条目。