联合主键 插入报重复

yiyishuitian 2012-04-29 08:51:54

SQL SERVER 2008 版本

执行代码如下:

IF OBJECT_ID('dbo.WaitStats') IS NOT NULL
DROP TABLE dbo.WaitStats;
GO

SELECT GETDATE() AS dt,
wait_type, waiting_tasks_count, wait_time_ms,
max_wait_time_ms, signal_wait_time_ms
into WaitStats
FROM sys.dm_os_wait_stats
WHERE 1 = 2;

GO

ALTER TABLE dbo.WaitStats ADD CONSTRAINT PK_WaitStats PRIMARY KEY(dt,wait_type);
CREATE INDEX idx_type_dt ON dbo.WaitStats(wait_type, dt);

GO

INSERT INTO WaitStats
SELECT GETDATE() as dt,
wait_type, waiting_tasks_count, wait_time_ms,
max_wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats;


查询结果:

(0 行受影响)
消息 2627,级别 14,状态 1,第 15 行
违反了 PRIMARY KEY 约束 'PK_WaitStats'。不能在对象 'dbo.WaitStats' 中插入重复键。
语句已终止。

我查询了
SELECT GETDATE() as dt,
wait_type, waiting_tasks_count, wait_time_ms,
max_wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats;

没有重复键呀,这是为什么不给插入呢.想不明白,请高手指点,谢谢!
...全文
882 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rowen-jdi 2013-11-13
  • 打赏
  • 举报
回复
我遇到了和楼主一样的问题——《SQLServer T-SQL查询技术内幕》那本书里的代码 我这边在SQL2008上情况和楼主一样! select wait_type,count(wait_type) as cnt from sys.dm_os_wait_stats group by wait_type having count(wait_type)>1 查询结果是没有发现重复行!!!但是插入主键约束的列后系统就是提示有重复! 我还发现了一个重复项“MISCELLANEOUS” 可是上面的重复项为什么在SQL Server2005上却不重复!!! 神马情况!
billpu 2012-04-29
  • 打赏
  • 举报
回复
看起来是人品问题
呵呵 你去先去掉约束,数据插完看看到底什么重复了
  • 打赏
  • 举报
回复
建议楼上不要建联合主键
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我这里是没有重复的,但也是没有报错的
[/Quote]

我这一样没重复,也不报错
yiyishuitian 2012-04-29
  • 打赏
  • 举报
回复
晕的了,我的报错,人品应该没有问题呀.
本来想看看数据库的等待情况,看看从哪方面能优化数据库的,结果第一部就出问题了,出师未捷身先死了呀!
难道要删除主键约束.
百年树人 2012-04-29
  • 打赏
  • 举报
回复
我这里是没有重复的,但也是没有报错的
yiyishuitian 2012-04-29
  • 打赏
  • 举报
回复
wait_type 没有重复的,

SELECT GETDATE() as dt,--这个是重复的
wait_type,--你检查原表里面的这个字段是否重复
waiting_tasks_count, wait_time_ms,
max_wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats;


大家可以查一下自己的表,肯定是没有重复的.
  • 打赏
  • 举报
回复

INSERT INTO WaitStats
SELECT GETDATE() as dt,--这个是重复的
wait_type,--你检查原表里面的这个字段是否重复
waiting_tasks_count, wait_time_ms,
max_wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats;


报错是不会骗你的
百年树人 2012-04-29
  • 打赏
  • 举报
回复
你这样select出来的dt是重复的,关键看wait_type是否有重复

select wait_type,count(1) as cnt from sys.dm_os_wait_stats
group by wait_type having count(1)>1
xiaoxiangqing 2012-04-29
  • 打赏
  • 举报
回复
不能插入重复的主键
yiyishuitian 2012-04-29
  • 打赏
  • 举报
回复
先去掉主键约束,插入数据后,再加主键约束,找到重复 wait_type 值 MISCELLANEOUS
现在很无语了
select count(wait_type) from sys.dm_os_wait_stats where wait_type = 'MISCELLANEOUS'
select count(distinct wait_type) from sys.dm_os_wait_stats where wait_type = 'MISCELLANEOUS'
结果相等,都是2.彻底无语,泪奔ing…………
xlc007 2012-04-29
  • 打赏
  • 举报
回复
你要插入的dt字段是重复的

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧