如何为实体框架数据库的varchar列创建唯一键?

时间:2013-12-23 23:39:11

标签: sql sql-server entity-framework unique

我曾经观看过youtube视频教程教学如何创建独特的密钥

http://www.youtube.com/watch?v=oqrsfatxTYE&list=PL08903FB7ACA1C2FB&index=9

在视频中,他为Email(nvarchar)列创建了一个唯一键,我可以在手动创建数据库时创建它,但是当我尝试为使用实体框架代码创建的数据库创建唯一键时,使用下一个查询

ALTER  TABLE Peoples
   ADD CONSTRAINT UQ_MyTable_Email UNIQUE (email)

会产生错误:

Msg 1919, Level 16, State 1, Line 2
Column 'email' in table 'Peoples' is of a type that is invalid for use as a key column in an index.

有什么问题?如何为nvarchar(max)列创建唯一键?

1 个答案:

答案 0 :(得分:8)

说如果你创建这个表

CREATE TABLE ConstTable 
(ID INT, 
Email VARCHAR(1000)
CONSTRAINT uc_Email UNIQUE (Email)
)
GO

你会收到警告:

  

警告!最大密钥长度为900字节。索引'uc_Email'有   最大长度为1000字节。对于某些大值的组合,   插入/更新操作将失败

您要在其上定义唯一约束的列应小于或等于900字节,因此如果您希望能够创建一个VARCHAR(900)NVARCHAR(450)列,则可以使用CREATE TABLE ConstTable (ID INT, Email VARCHAR(900) CONSTRAINT uc_Email UNIQUE (Email) ) GO CREATE TABLE ConstTable (ID INT, Email VARCHAR(MAX) ) GO 列该列的唯一约束

上面的相同表格与VARCHAR(450)创建时没有任何警告

CREATE INDEX ix_SomeIdex
ON ConstTable (Email)

<强>结果

  

命令已成功完成。

测试您的表

说这是你的表

{{1}}

现在尝试在VARCHAR(MAX)数据类型上创建任何索引,您将得到相同的错误。

{{1}}

错误消息

  

Msg 1919,Level 16,State 1,Line 1列'电子邮件'在表格中   'ConstTable'是一种无效用作关键列的类型   索引。