如果cardescription
位于具有特定@idCar
的行的表格中,我想抛出异常
cardescription
不是PK,不允许任何设计更改
insert into carsdescription
(description)
value
(@description,@idCar)
示例:
IDCar | Description
---------------------
1 | nice - this record was in table before.
1 | nice - should throw exception
2 | nice - it is allowed
Carsdescription表:
汽车表:
答案 0 :(得分:3)
您应该在IDCar和Description上创建唯一索引。然后您的数据库将阻止插入重复数据。然后,您的CommandObject将抛出异常。
insert into carsdescription(IDCar, description)
values (@idCar, @description)
但是为了对你的用户好一点,你应该首先在你的表中查找是否有重复的条目。
select count(*) from carsdescription where IDCar = @idCar and decription = @description
修改强>
出于某些原因,不允许进行架构更改。这意味着,您的数据库无法保护您免受重复条目的影响。因此,正如马修正确指出的那样,你必须:
答案 1 :(得分:1)
如果你不能使用索引(为什么不?作业要求??),那么你可以在插入之前检查,记录是否已经存在,只有在它不存在时才插入:
IF NOT EXISTS(SELECT * FROM dbo.cardescription
WHERE idCar = @idCar AND Description = @description)
INSERT INTO dbo.carsdescription(description, idCar)
VALUES(@description, @idCar)
ELSE
RAISERROR(N'Duplicate record - INSERT aborted', 16, 1)
在MSDN tech library中读取RAISERROR - 这将在调用.NET应用程序中导致异常。
但是具有唯一索引的解决方案肯定会更好!
CREATE UNIQUE NONCLUSTERED INDEX UIX01_Cardescription
ON dbo.CarDescription(idCar, description)
这样,就没有办法插入任何重复项 - 即使有人设法使用Excel或其他工具连接到您的数据库,使用IF NOT EXISTS检查绕过SQL INSERT语句。
答案 2 :(得分:0)
INSERT没有WHERE,在查询中使用SELECT语句来使用WHERE。
insert into carsdescription
(description)
SELECT (@description) FROM carsdescription
where idCar=@idCar;
答案 3 :(得分:0)
就数据库而言,这是一个允许的事务,因此如果您无法更改数据库中的约束(通过添加索引或触发器),则需要在应用程序中执行此操作。
第一
Select exists(*) from carsdescription where IDCar = ? and description = ?
如果返回true,请让代码抛出异常,如果不是,请执行insert。
您没有说出您正在使用的RMDBS。在Oracle中,您可以编写一个pl / sql过程,该过程将变量设置为select的结果,根据结果执行插入或抛出异常