填充数据表时为什么缺少唯一约束?

时间:2017-08-15 12:32:54

标签: c# sql-server sqldataadapter

我在SQL server

中有以下表格
projects
   id(PK, int, not null)
   name (varchar(255), not null)
   public_key_token (varchar(50), null)

我已使用

name列添加了一个唯一约束
ALTER TABLE dbo.projects  
ADD CONSTRAINT name_unique UNIQUE (name);

会在表上产生Unique, Non-Clustered索引(信任SSMS)。

在代码中我正在使用

检索表数据
using (SqlDataAdapter adapter = new SqlDataAdapter("select * from " + DbTabName, con))
{
    using (DataTable table = new DataTable(DbTabName))
    {
         DataTable dt = adapter.FillSchema(table, SchemaType.Source);
         PkColumns = dt.PrimaryKey.Select(c => c.ColumnName).ToList();
         AutoIncrementColumns = dt.PrimaryKey.Where(c => c.AutoIncrement).Select(c => c.ColumnName).ToList();
         UniqueColumns = dt.Columns.Cast<DataColumn>().Where(c => c.Unique).Select(c => c.ColumnName).ToList();

         ...
    }
}

PKs和AutoIncrement列都没问题,但在UniqueColumns我只能再次获得PK列。 name列在没有Unique约束的情况下到达C#。

SchemaType更改为Mapped并未改变结果。

为什么我在去C#的途中失去了这个约束?我错过了SQL Server端或C#中的内容吗?

[UPDATE] @Tim-Schmelter的回答只解决了问题的一半。

只是添加索引不起作用。当id列上的PK存在时,添加索引也不起作用。

我让它工作的唯一方法是删除表,在没有任何键和索引的情况下重新创建它,然后在Tim的答案中添加unique索引。但是,在再次为id列添加PK之后,我又回到了仅将id列为唯一列的旧行为。 这真的很奇怪。

1 个答案:

答案 0 :(得分:2)

将此用于create a unique index或使用SSMS的gui。

CREATE UNIQUE NONCLUSTERED INDEX [name_unique] ON [dbo].[projects]
(
    name ASC
)

您添加了唯一约束而非唯一索引。

您的代码现在已成功检索UniqueColumns(单列name)。