我有一张桌子,
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))
我收到的错误为:-参与外键关系的列必须定义为具有相同的长度和比例。
我怎样才能摆脱这个?
您无法在临时表中创建引用列,但在物理表中您可以使用代码创建引用列:
--在 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 并定义相同的长度,这将是我们可以在另一个表的引用列中定义的实际列长度。
第一张桌子 -
CAST(... AS VARCHAR)
第二张桌子 -
CREATE TABLE ... (ID VARCHAR ...)
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))
创建表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)
);