黑马程序员技术交流社区

标题: SQL新建主键 [打印本页]

作者: 王连    时间: 2012-4-20 09:02
标题: SQL新建主键
SQL2008中通过新建查询新建主键的语句是什么啊?或者说怎么通过新建查询新建主键?
作者: 李宗鹏    时间: 2012-4-20 09:21
本帖最后由 李宗鹏 于 2012-4-20 09:23 编辑

alter table 表名 add primary key(列名)
这句就是把表中某个列设置成主键
作者: 王连    时间: 2012-4-20 09:29
李宗鹏 发表于 2012-4-20 09:21
alter table 表名 add primary key(列名)
这句就是把表中某个列设置成主键

消息 8111,级别 16,状态 1,第 1 行
无法在表 'asd' 中可为 Null 的列上定义 PRIMARY KEY 约束。
消息 1750,级别 16,状态 0,第 1 行
无法创建约束。请参阅前面的错误消息。
这是什么意思
作者: 李宗鹏    时间: 2012-4-20 09:40
王连 发表于 2012-4-20 09:29
消息 8111,级别 16,状态 1,第 1 行
无法在表 'asd' 中可为 Null 的列上定义 PRIMARY KEY 约束。
消息  ...

主键一般都设置在int类型的列!也有特殊情况!
有的列不可以设成主键!比如name列就不可以设置成主键?因为名字里边会有可能出现相同的名字
作者: 王连    时间: 2012-4-20 09:45
李宗鹏 发表于 2012-4-20 09:40
主键一般都设置在int类型的列!也有特殊情况!
有的列不可以设成主键!比如name列就不可以设置成主键?因 ...

create table asd(Number int,Name nvarchar(max),Age int)
insert into asd(Number,Name,Age) values(1,'王连',23)
insert into asd(Number,Name,Age) values(2,'南充',22)
insert into asd(Number,Name,Age) values(3,'四川',21)
alter table asd add NickName nvarchar(max)
insert into asd(Number,Name,Age,NickName) values(4,'Tom',20,'小强')
update asd set NickName=N'丑鬼' where Age=21
alter table asd add primary key(Number)

这就是我的语句 你看看为啥不能设置嘛 谢谢了
作者: 骆崇飞    时间: 2012-4-20 09:51
你主键是后来添加的,而主键是绝对不能为空的,但是你此前插入的数据中,主键这一列是空的,违反了主键不能为空这一条例!
作者: 李宗鹏    时间: 2012-4-20 10:51
王连 发表于 2012-4-20 09:45
create table asd(Number int,Name nvarchar(max),Age int)
insert into asd(Number,Name,Age) values(1, ...


主键不可以为空!你添加Number列的时候把Number的值设成允许为空了!主键不可以为空!改一下就行了
作者: 冲动    时间: 2012-4-20 11:14
SELECT TOP 100 PERCENT --a.id,
       --CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
       d.name AS 表名,
       CASE WHEN a.colorder = 1 THEN isnull(f.value, '') ELSE '' END AS 表说明,
       a.colorder AS 字段序号, a.name AS 字段名, ISNULL(g.[value], '') AS 字段说明,
       CASE WHEN COLUMNPROPERTY(a.id,a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END AS 标识,
       CASE WHEN EXISTS
           (SELECT 1 FROM dbo.sysindexes si
             INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id AND si.indid = sik.indid
             INNER JOIN dbo.syscolumns sc ON sc.id = sik.id AND sc.colid = sik.colid
             INNER JOIN dbo.sysobjects so ON so.name = si.name AND so.xtype = 'PK'
          WHERE sc.id = a.id AND sc.colid = a.colid) THEN '√' ELSE '' END AS 主键,
       b.name AS 类型, a.length AS 长度, COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS 精度,
       ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,
       CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, ISNULL(e.text, '') AS 默认值,
       d.crdate AS 创建时间,
       CASE WHEN a.colorder = 1 THEN d.refdate ELSE NULL END AS 更改时间
FROM dbo.syscolumns a
       LEFT OUTER JOIN dbo.systypes b ON a.xtype = b.xusertype
       INNER JOIN dbo.sysobjects d ON a.id = d.id AND d.xtype = 'U' AND d.status >= 0
       LEFT OUTER JOIN dbo.syscomments e ON a.cdefault = e.id
       LEFT OUTER JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id AND g.name = 'MS_Description'
       LEFT OUTER JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0 AND f.name = 'MS_Description'
ORDER BY d.name, 字段序号

该SQL可以查询数据库里详细的数据字典。分享一下。
作者: 冲动    时间: 2012-4-20 11:16
看错了哈,分享一个小技巧。
你打开表设计器,把某一列设置为主键,然后右键 生成更改脚本。就可以看到你的操作对应的脚本。
作者: 王连    时间: 2012-4-20 12:15
骆崇飞 发表于 2012-4-20 09:51
你主键是后来添加的,而主键是绝对不能为空的,但是你此前插入的数据中,主键这一列是空的,违反了主键不能 ...

懂了 谢谢
作者: 王连    时间: 2012-4-20 12:16
李宗鹏 发表于 2012-4-20 10:51
主键不可以为空!你添加Number列的时候把Number的值设成允许为空了!主键不可以为空!改一下就行了 ...

明白了,原来问题出在这里
作者: 过客    时间: 2012-4-20 14:48
alter table 表名 add primary key(列名),这样就行了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2