日期:2014-05-16  浏览次数:20420 次

简单的SQL语句哪里错了?
写了一个简单的存储过程:

create procedure insert_data(@NodId int, @NodName varchar(20), @Flag tinyint, @Value float)
AS BEGIN
insert into dev values(@NodId, @NodName, @Flag, @Value)
END

然后写一个简单的代码去调用它:

DECLARE @i INT
SET @i = 1
while(@i < 3)
BEGIN
exec dbo.insert_data @i, '压力传感设备', 1, 29.9
SET @i = @i+1
END


因为NodId 是主键(所建立的表的成员就是上面那四个变量),所以执行出错了:

消息 2627,级别 14,状态 1,过程 insert_data,第 23 行
违反了 PRIMARY KEY 约束 'PK_dev'。不能在对象 'dbo.dev' 中插入重复键。

它在没有主键的时候运行没有问题,而且运行后我没有发现有NodId重复的行啊

上面的该怎么改一下呢,我的要求只是能批量的插入一万条数据(或者更多)
------解决方案--------------------
照理应该不会报错吧。
------解决方案--------------------
批量插入1万条数据:
DECLARE @i INT
SET @i = 1
while(@i <= 1000)
BEGIN
exec dbo.insert_data @i, '压力传感设备', 1, 29.9
SET @i = @i+1
END

------解决方案--------------------
修改一下,可以先truncate table dev 表,然后

DECLARE @i INT
SET @i = 1
while(@i <= 10000)
BEGIN
exec dbo.insert_data @i, '压力传感设备', 1, 29.9
SET @i = @i+1
END

------解决方案--------------------
引用:
Quote: 引用:

修改一下,可以先truncate table dev 表,然后

DECLARE @i INT
SET @i = 1
while(@i <= 10000)
BEGIN
exec dbo.insert_data @i, '压力传感设备', 1, 29.9
SET @i = @i+1
END


已经是清空了的表。但是我在另外一个表里没有使用主键,就没有这个问题。
因为我这个表是得发布出去的,所以必须要有主键 ,就难住了。我也很纳闷,如果没有主键插入的数据压根就没有看到重复的,这里真纠结。


你就只有运行一次把,不是同时开N个运行把,那照理是不会有问题的呀
------解决方案--------------------
你的主键是哪个?nodid没重复行是因为插入不成功
------解决方案--------------------
消息 2627,级别 14,状态 1,过程 insert_data,第 23 行
违反了 PRIMARY KEY 约束 'PK_dev'。不能在对象 'dbo.dev' 中插入重复键。


说明你表中应该有个字段dev有主键约束,而你给表插入数据没有包括该主键字段,系统会自动给该字段空值,但主键字段不允许存在两个及两个以上的空值,所以出错!你必须在插入其他字段值得时候也给主键字段插入值,或者给主键字段设置
dev int identity(1,1) 如果数据类型符合的话,这个应该也可以解决

------解决方案--------------------
create procedure insert_data(@NodId int, @NodName varchar(20), @Flag tinyint, @Value float)
AS BEGIN
    insert into dev(nodid,nodname,flag,value) values(@NodId, @NodName, @Flag, @Value)
END


你的数据有null值吗?
------解决方案--------------------
引用
消息 2627,级别 14,状态 1,过程 insert_data,第 23 行
违反了 PRIMARY KEY 约束 'PK_dev'。不能在对象 'dbo.dev' 中插入重复键。

SQL code

?
1
2
说明你表中应该有个字段dev有主键约束,而你给表插入数据没有包括该主键字段,系统会自动给该字段空值,但主键字段不允许存在两个及两个以上的空值,所以出错!你必须在插入其他字段值得时候也给主键字段插入值,或者给主键字段设置
dev int identity(1,1) 如果数据类型符合的话,这个应该也可以解决

可是我就四个字段,存储过程里面对应的也就四个字段。“给表插入数据没