nvarchar类型的唯一列

时间:2013-04-14 17:42:12

标签: sql sql-server linq-to-sql unique nvarchar

我有一张简单的表格:

Filepath | deleted | categories | description

我想将该表用于Linq to SQL实体模型。在模型上,该列path(在那里是字符串,数据库中为nvarchar)可以设置为主键,但Visual Studio表设计器不是这种情况。

路径是使一个文件唯一的原因,因此我必须确保表中没有重复的路径。怎么实现呢?谢谢你的时间。

2 个答案:

答案 0 :(得分:4)

使用UNIQUE约束,NOT NULL UNIQUE约束或SQL中的PRIMARY KEY约束使列唯一。但是我能想到的每一个当前的dbms都有一个或多个对可以受限制的列长度的限制。

这意味着对于最常见的情况有一个相当停止显示的问题。例如,UNC path on Windows可以是大约32,767个字符。

Linux系统差异很大。基于谷歌的快速研究,1024和4096似乎很常见。

我认为你必须对代理键设置一个独特的约束。 (你有没有想法这会伤害数据库的人多少。)问题在于你可以在代理上强制执行唯一性,但不能代替它所取代的东西。它取而代之的是重要的部分。

在一般情况下,身份证号码不起作用;你可以很容易地得到{1,/ etc / adjtime},{2,/ etc / adjtime},{3,/ etc / adjtime}。你需要以某种方式将真实数据与代理键的值联系起来的东西。像hashbytes()这样的东西会在T-SQL中“起作用”; linq具有类似的功能。 (但是你可以像几乎所有哈希函数一样发生冲突。)

答案 1 :(得分:3)

正如Martin已经解释的那样,只要值<= 450个字符(或900个字符,如果您能够约束数据以便不允许使用Unicode字符),则可以创建主键。这很好用:

CREATE TABLE dbo.sample1
(
  path NVARCHAR(450) NOT NULL PRIMARY KEY,
  deleted BIT NOT NULL DEFAULT 0
  -- ... other columns ...
);

CREATE TABLE dbo.sample2
(
  path VARCHAR(900) NOT NULL PRIMARY KEY,
  deleted BIT NOT NULL DEFAULT 0
  -- ... other columns ...
);

某些未声明版本的Visual Studio中的某个视觉设计师是否允许您这样做,我不知道,但您没有 使用某个视觉设计师创建表格,对吗?

如果路径容易超过900字节,那么你就不能把它变成一把钥匙,对不起。您必须使用IDENTITY列,其他代理或路径值的哈希值才能在密钥中使用。支持最多4000个字符的路径的示例 - 不满足所有潜在用例,但希望您不需要超过4000:

CREATE TABLE dbo.sample3
(
  [path] NVARCHAR(4000) NOT NULL,
  pathhash AS CONVERT(VARBINARY(900), HASHBYTES('MD5', path)) 
    PERSISTED PRIMARY KEY
);

INSERT dbo.sample3([path])
  SELECT '\\some\share\x' + REPLICATE('x', 900) + '.gif'
  UNION ALL SELECT '\\some\share\x' + REPLICATE('x', 900) + '.jpg';

尝试再次运行插入。

(再次,您可以将4000个字符加倍到8000个字符,如果,您可以保证没有路径包含Unicode字符;在这种情况下,您可以使用varchar(8000)代替{ {1}}。)