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

时间:2016-12-13 08:01:22

标签: sql sql-server sql-server-2008

我有一张桌子,

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))

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

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

我得到的错误是: - 参与外键关系的列必须以相同的长度和比例定义。

我怎样摆脱这个?

2 个答案:

答案 0 :(得分:2)

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

- 在temp中,它为“ 跳过FOREIGN KEY约束'#tmptwo'临时表的定义提供错误。对本地或全局临时表不强制执行FOREIGN KEY约束。 “但是相同的代码更改适用于物理表:

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))

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

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

答案 1 :(得分: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))