MySQL字段在更新时设置为0

MySQL字段在更新时设置为0,mysql,Mysql,有没有一种方法可以在不使用PHP或在我的查询中显式包含该行的情况下,在该行更新时将字段设置为0?定义表时,可以设置默认值=0 发件人: 比方说 CREATE TABLE test ( a INT, b INT DEFAULT 0); 如果我们这样做 INSERT INTO test (a) values (1),(2),(3); 那么当我们 SELECT * FROM test 我们会得到 a | b 1 0 2 0 3 0 查看它在上的工作起初,这对我来说似

有没有一种方法可以在不使用PHP或在我的查询中显式包含该行的情况下,在该行更新时将字段设置为0?

定义表时,可以设置默认值
=0

发件人:

比方说

CREATE TABLE test (
a INT,
b INT DEFAULT 0);
如果我们这样做

INSERT INTO test (a) values (1),(2),(3);
那么当我们

SELECT * FROM test
我们会得到

a  |  b
1     0
2     0
3     0

查看它在

上的工作起初,这对我来说似乎是一个奇怪的请求,但实际上在MySQL中是可能的。如果指定
0
作为该字段的默认值,则可以利用
REPLACE INTO
对未指定但现有的列使用默认值这一事实

INSERT INTO t1 (id, numToZero, value) VALUES (1, 1345, 'value');
稍后,当您要更新时:

REPLACE INTO t1 (id, value) VALUES (1, 'new value');
这将产生
(1,0,“新值”)
,而不创建新行。

使用触发器:

CREATE TRIGGER set_zero AFTER UPDATE ON table_name
   FOR EACH ROW
      UPDATE table_name SET col_name=0 WHERE xyz=cond_xyz;
;

没有测试它。

触发器是正确的方法,但塞巴斯蒂安完全弄错了

您不需要在触发器内运行
UPDATE
,只需将值分配给传递给触发器的
new
记录即可。此外,它必须是更新之前的
触发器(因为在之后的触发器中对
新的
记录所做的更改不会持久化)

请注意,即使定义了默认值,也可以在插入期间提供非零值。如果您也不希望这样,那么还需要一个插入触发器


下面是一个SQLFIDLE示例:

该字段已经设置了默认值。我需要的是,如果对该行进行了更新,则该字段的值将被更改回0(如果它以前被更新为其他内容)。啊,我明白了。好吧,这是一个创造触发器的问题,就像@Sebastian所建议的那样。希望这些答案能对你有所帮助。这看起来可能有用。我必须做更多的研究,研究如何将其应用到我的实际用例中。谢谢。我该怎么更新那一行呢?这似乎会更新所有行。我看到了WHERE子句,但是我怎么才能把
WHERE id=“id”只放在更新的行中“
我不知道!但我发现了这个线索:上面的代码会导致无限递归,这是真的。它也有一个解决方案。另一个线程说,在
之前使用
就可以了。MySQL使用行级触发器,您不必
更新
表,只需为传递到触发器的
新的
记录赋值。
CREATE TRIGGER set_zero AFTER UPDATE ON table_name
   FOR EACH ROW
      UPDATE table_name SET col_name=0 WHERE xyz=cond_xyz;
;
CREATE TRIGGER set_zero 
  BEFORE UPDATE ON table_name
  FOR EACH ROW
BEGIN
  SET new.col_name = 0; 
END;