2012-04-24 37 views
0

鉴于以下T-SQL语句,我(通过检查)如何确定主键?如果它没有列出(像我怀疑)它会是什么样子?从SQL Server语句确定主键

CREATE TABLE [dbo].[BLDGINFO](
    [LBLDGRUNNO] [int] NULL, 
    [LBLDGNO] [int] NOT NULL, 
    [FBIVOLUME] [float] NULL, 
    [FBIACOND] [float] NULL, 
    [NBIHTYPE] [float] NULL, 
    [NBILTYPE] [float] NULL, 
    [NBISTORIES] [float] NULL, 
    [NBIFTYPE] [float] NULL, 
    [NBIBEDS] [float] NULL, 
    [NBIUNITS] [float] NULL, 
    [SBIRATENO] [nvarchar](31) NULL, 
    [NBICTYPE] [float] NULL, 
    [NBIYEARBLT] [int] NULL DEFAULT ((0)), 
    [NBITHBNDRY] [int] NULL 
) ON [PRIMARY] 
+1

正如BluesRockAddict指出的那样...此示例没有定义主键。 – RThomas 2012-04-24 06:16:34

回答

1

如果主键已经定义完毕,将会是LBLDGNO。但是,很可能根本没有定义主键。您可以如下确定:

SELECT c.name 
FROM sys.indexes i, sys.index_columns ic, sys.objects o, sys.columns c 
WHERE o.object_id = i.object_id 
AND ic.index_id = i.index_id AND ic.object_id = i.object_id 
AND c.object_id = o.object_id AND c.column_id = ic.column_id 
AND i.is_primary_key = 1 
AND o.name = 'BLDGINFO' 

此查询将返回包含在主键中的所有列。如果它返回一个空的结果集,那么没有定义主键。

+0

这太棒了!谢谢! – rh0dium 2012-04-24 12:33:58

1

在你的问题表定义不包含主键,这里是被定义为ID列主键为例:

CREATE TABLE [dbo].[BLDGINFO](
    id int NOT NULL, 
    [LBLDGRUNNO] [int] NULL, 
    [LBLDGNO] [int] NOT NULL, 
    [FBIVOLUME] [float] NULL, 
    [FBIACOND] [float] NULL, 
    [NBIHTYPE] [float] NULL, 
    [NBILTYPE] [float] NULL, 
    [NBISTORIES] [float] NULL, 
    [NBIFTYPE] [float] NULL, 
    [NBIBEDS] [float] NULL, 
    [NBIUNITS] [float] NULL, 
    [SBIRATENO] [nvarchar](31) NULL, 
    [NBICTYPE] [float] NULL, 
    [NBIYEARBLT] [int] NULL DEFAULT ((0)), 
    [NBITHBNDRY] [int] NULL, 
    PRIMARY KEY (id) 
) ON [PRIMARY] 
+0

所以它看起来和直接的SQL非常相似。有趣的,因为我还没有看到这一点。 – rh0dium 2012-04-24 12:26:45

2

表格中的唯一字段可能可以工作作为主键是LBLDGNO,因为主键列不能为空。

+0

啊,我没听懂!但是,它不需要是唯一的吗?因此,当我正在处理这个问题时,我发现以“L”开头的字段似乎是假的外键。在MSSQL中可以使用外键作为主键吗? – rh0dium 2012-04-24 12:29:16

+0

您不能将外键用作主键,因为它们是不同的约束。但是,字段可能同时属于主键和外键,就像在创建1-1关系时一样。主键确实需要是唯一的,但这个约束是由外键应用的,而不是由表定义本身应用的。 – Peter 2012-04-24 13:52:49