日期:2014-05-17  浏览次数:20885 次

联合主键 插入报重复

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;

没有重复键呀,这是为什么不给插入呢.想不明白,请高手指点,谢谢!

------解决方案--------------------
你这样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
------解决方案--------------------

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;


报错是不会骗你的
------解决方案--------------------
看起来是人品问题 
呵呵 你去先去掉约束,数据插完看看到底什么重复了