主键和外键的大小

mou*_*aim 2 sql-server-2008 foreign-key primary-key

在 sql server 2008 中,主键和引用它的外键是否必须具有相同的列大小?有人可以告诉我一个解释这个的文档的链接吗?

谢谢你的帮助。

ype*_*eᵀᴹ 6

是的。它在 MSDN 文档页面中:外键关系

FOREIGN KEY在表级别指定的约束必须具有与约束列列表中的列数相同的引用列数。每个引用列的数据类型也必须与列列表中对应的列相同

该页面没有提供更多详细信息,但测试表明“相同数据类型”意味着相同类型和相同大小。此外,如果尝试FOREIGN KEY在 aVARCHAR(20)VARCHAR(30)列之间进行约束,

CREATE TABLE a
( aid VARCHAR(20) PRIMARY KEY ) ;

CREATE TABLE b
( bid INT PRIMARY KEY,
  aID VARCHAR(30) ) ;


ALTER TABLE b
  ADD CONSTRAINT test_different_sizes
    FOREIGN KEY (aid)
    REFERENCES a (aid) ;
Run Code Online (Sandbox Code Playgroud)

我们得到解释性错误

架构创建失败:列a.aid 的长度或比例与引用b.aid外键中的列不同test_different_sizes。参与外键关系的列必须定义为相同的长度和比例


另请注意,某些 DBMS(如 Oracle、MySQL、Postgres)允许相同数据类型(即VARCHARCHAR)但大小不同的列之间的外键。

Postgres 甚至不那么严格。它允许列之间的外键CHARVARCHARTEXT任何组合的数据类型。