A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王连 中级黑马   /  2012-4-20 09:02  /  4542 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

SQL2008中通过新建查询新建主键的语句是什么啊?或者说怎么通过新建查询新建主键?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

11 个回复

倒序浏览
李宗鹏 来自手机 中级黑马 2012-4-20 09:21:45
沙发
本帖最后由 李宗鹏 于 2012-4-20 09:23 编辑

alter table 表名 add primary key(列名)
这句就是把表中某个列设置成主键

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
李宗鹏 发表于 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:00
板凳
王连 发表于 2012-4-20 09:29
消息 8111,级别 16,状态 1,第 1 行
无法在表 'asd' 中可为 Null 的列上定义 PRIMARY KEY 约束。
消息  ...

主键一般都设置在int类型的列!也有特殊情况!
有的列不可以设成主键!比如name列就不可以设置成主键?因为名字里边会有可能出现相同的名字
回复 使用道具 举报
李宗鹏 发表于 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)

这就是我的语句 你看看为啥不能设置嘛 谢谢了
回复 使用道具 举报
你主键是后来添加的,而主键是绝对不能为空的,但是你此前插入的数据中,主键这一列是空的,违反了主键不能为空这一条例!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
李宗鹏 来自手机 中级黑马 2012-4-20 10:51:33
7#
王连 发表于 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:09
8#
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可以查询数据库里详细的数据字典。分享一下。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
冲动 初级黑马 2012-4-20 11:16:46
9#
看错了哈,分享一个小技巧。
你打开表设计器,把某一列设置为主键,然后右键 生成更改脚本。就可以看到你的操作对应的脚本。
回复 使用道具 举报
骆崇飞 发表于 2012-4-20 09:51
你主键是后来添加的,而主键是绝对不能为空的,但是你此前插入的数据中,主键这一列是空的,违反了主键不能 ...

懂了 谢谢
回复 使用道具 举报
李宗鹏 发表于 2012-4-20 10:51
主键不可以为空!你添加Number列的时候把Number的值设成允许为空了!主键不可以为空!改一下就行了 ...

明白了,原来问题出在这里
回复 使用道具 举报
alter table 表名 add primary key(列名),这样就行了。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马