我有一个包含url的表和一个表示其参数的字符串.问题是我想要一个url和一个参数字符串作为表的唯一约束 - 也就是说没有条目可以具有相同的url和参数字符串.参数字符串可以是任意长度(比800bytes长左右这是一个MySQL的关键最大长度,所以因为它抛出一个错误,我不能用独有的(URL,则params)...).
我考虑使用触发器来执行此操作,但如果触发器发现插入即将插入重复条目,如何抛出异常/引发错误?我想我想抛出MySqlException,就像MySql一样,重复主键等,所以我可以用我的C#代码捕获它.
我在触发器中有两个部分需要帮助:...中止抛出异常到C#...如何向C#抛出异常等?...允许插入... - 如果没有重复输入,我如何才允许插入?
继承人触发代码:
CREATE TRIGGER urls_check_duplicates
BEFORE INSERT ON urls
FOR EACH ROW
BEGIN
DECLARE num_rows INTEGER;
SELECT COUNT(*)
INTO num_rows
FROM urls
WHERE url = NEW.url AND params = NEW.params;
IF num_rows > 0 THEN
... ABORT/throw exception to C# ...
ELSE
... Allow insert ...
END
Run Code Online (Sandbox Code Playgroud) 由于MySQL忽略了检查约束,如何使用触发器来阻止插入或更新发生?
例如:
表foo有一个名为agency的属性,agency属性只能是1,2,3,4或5.
delimiter $$
create trigger agency_check
before insert on foo
for each row
begin
if (new.agency < 1 or new.agency > 5) then
#Do nothing?
end if;
end
$$
delimiter ;
Run Code Online (Sandbox Code Playgroud)
或者有没有更好的方法来在MySQL中进行检查约束?
对于一个项目中的测试用例,如果字段之一满足条件之一,我必须删除记录。最简单的似乎是简单的触发器:
delimiter $$
drop trigger w_leb_go $$
create trigger w_leb_go after update on test
for each row
begin
set @stat=NEW.res;
set @id=NEW.id;
IF @stat=3 THEN
delete from test where id=@id;
END IF;
end$$
delimiter ;
Run Code Online (Sandbox Code Playgroud)
但正如我怀疑有错误:
更新测试集 res=3,其中 id=1;
错误 1442 (HY000):无法更新存储函数/触发器中的表“test”,因为它已被调用此存储函数/触发器的语句使用。
仅通过访问数据库还可以如何完成?我的意思是我不应该更改经过测试的应用程序。
我有一个表格,其中我有一些列a,b,c,每列有另一列,比如说,(x,y,z)它们a,b,c分别依赖.
x,y,z1如果a,b,c有任何值将具有值,如果包含null将包含null a,b,c has null.
举个例子,让我们说,存储的值a是2和x依赖于它的列.所以x会有价值1.
如果存储的值a是,null则 x值为null.
那么有没有一种方法可以在创建表时声明这个约束.
除了触发器之外,请提出建议.
可能的重复:
MySQL 触发器在某些条件下阻止 INSERT
在MySQL中,BEFORE INSERT TRIGGER如何在条件下跳过数据插入?
delimiter //
drop trigger if exists test_trigger //
create trigger test_trigger before insert on t
for each row
begin
set @found := false;
#Some code
if @found then
#How to skip the data insertion under condition?
end if;
end //
delimiter ;
Run Code Online (Sandbox Code Playgroud) mysql ×6
triggers ×4
database ×2
sql ×2
constraints ×1
duplicates ×1
php ×1
privileges ×1
sql-delete ×1
sql-update ×1