【问题标题】:How to create Unique key for a varchar column for entity framework database?如何为实体框架数据库的 varchar 列创建唯一键?
【发布时间】:2013-12-23 23:39:10
【问题描述】:

我看过 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) 列创建唯一键?

【问题讨论】:

  • 您的电子邮件列的数据长度是多少??
  • 是一个 nvarchar(max) 列
  • 在这里,首先,您不能在 VARCHAR(MAX) 列上创建任何索引,当您创建唯一约束时,它实际上会在幕后创建一个非聚集唯一索引。您需要更改数据类型并查看我的答案以了解更多详细信息。
  • 为什么要使用 VARCHAR(MAX) 作为电子邮件列?只需使用 varchar 100-200 之类的东西,我个人从未见过超过 50 个字符的电子邮件 :)
  • 因为我使用的是 Code First,当我没有指定列的长度时,它将使用 Max 创建。我更改了 NVARCHAR(50) 的类型,并添加了唯一约束成功,非常感谢!

标签: sql sql-server entity-framework unique


【解决方案1】:

说如果你创建这个表

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

你会收到警告:

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

您要在其上定义唯一约束的列应小于或等于 900 字节,因此如果您希望能够在其上创建唯一约束,则可以拥有 VARCHAR(900)NVARCHAR(450) 列专栏

与 VARCHAR(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(MAX) 数据类型上创建任何索引,您将得到相同的错误。

CREATE INDEX ix_SomeIdex
ON ConstTable (Email)

错误信息

消息 1919,级别 16,状态 1,第 1 行表中的“电子邮件”列 'ConstTable' 的类型不能用作关键列 一个索引。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2011-09-28
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多