参与外键关系的列必须定义为相同的长度和比例

问题描述 投票:0回答:3

我有一张桌子,

CREATE TABLE tmpOne(testID INT IDENTITY (1,1), 
ID AS ('ABC'+ (CASE WHEN len(testID) <=3 THEN CAST(RIGHT(0.001*testID, 3) AS VARCHAR) ELSE CAST(testID AS VARCHAR) END))PERSISTED UNIQUE, 
Ename VARCHAR(20))

我想创建另一个表#temptwo,其列PID引用表#tmpone的ID我这样做了

CREATE TABLE tmptwo(ID VARCHAR FOREIGN KEY REFERENCES tmpone(ID))

我收到的错误为:-参与外键关系的列必须定义为具有相同的长度和比例。

我怎样才能摆脱这个?

sql sql-server sql-server-2008
3个回答
2
投票

您无法在临时表中创建引用列,但在物理表中您可以使用代码创建引用列:

--在 temp 中,它给出的错误为“跳过临时表的外键约束'#tmptwo'定义。本地或全局临时表上不强制执行外键约束。”,但具有位更改的相同代码适用于物理表:

CREATE TABLE tmpOne(testID INT IDENTITY (1,1), 
ID AS 
    CAST(('ABC'+ (CASE WHEN len(testID) <=3 THEN   
        CAST(RIGHT(0.001*testID, 3) AS VARCHAR(20)) 
    ELSE CAST(testID AS VARCHAR(20)) END)) as VARCHAR(50)) PERSISTED UNIQUE, 
Ename VARCHAR(20))

CREATE TABLE tmptwo(ID VARCHAR(50) FOREIGN KEY REFERENCES tmpone(ID))

我相信你能识别出这些变化:)

我们必须将整个列值转换为 VARCHAR 并定义相同的长度,这将是我们可以在另一个表的引用列中定义的实际列长度。


1
投票

第一张桌子 -

CAST(... AS VARCHAR)

您转换为 varchar 但没有指定长度。
默认长度为30(+'ABC'长度)

第二张桌子 -

CREATE TABLE ... (ID VARCHAR ...)

您声明了一个 varchar 列,但没有指定长度。
默认长度为 1。

https://msdn.microsoft.com/en-us/library/ms176089.aspx

当数据定义或变量声明中未指定 n 时 语句,默认长度为1。当使用时不指定n CAST 和 CONVERT 函数,默认长度为 30。

您应该在两个表上声明长度,并且不应依赖默认值。 此外,如果您用

cast
/
left
包装整个计算列表达式,您将不会感到意外。

CREATE TABLE tmpOne
(
    testID  INT IDENTITY (1,1)
   ,ID      AS (cast ('ABC'+ (CASE WHEN len(testID) <=3 THEN CAST(RIGHT(0.001*testID, 3) 
                     AS VARCHAR(100)) ELSE CAST(testID AS VARCHAR(100)) END) 
                         as varchar(100))) PERSISTED UNIQUE
   ,Ename   VARCHAR(20)
)


CREATE TABLE tmptwo(ID VARCHAR (100) FOREIGN KEY REFERENCES tmpone(ID))

0
投票

创建表Table1 ( id int 身份(1,1), User_id as 'ABC'+Right('0000'+cast(id as varchar(20)),20) 持久唯一, 薪资整数 ); sp_help Table1 - 这是检查 User_id 的长度并在参考表中给出该长度 创建表Table2 ( id int 身份(1,1), User_id_Table2 varchar(23) 外键引用Table1(User_id), 名称 varchar(50)

);

© www.soinside.com 2019 - 2024. All rights reserved.