我在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
列为唯一列的旧行为。
这真的很奇怪。
答案 0 :(得分:2)
将此用于create a unique index或使用SSMS的gui。
CREATE UNIQUE NONCLUSTERED INDEX [name_unique] ON [dbo].[projects]
(
name ASC
)
您添加了唯一约束而非唯一索引。
您的代码现在已成功检索UniqueColumns
(单列name
)。