2013-03-22 59 views

回答

1

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

CREATE TABLE Syntax

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 
    .../... 
column_definition: 
    data_type [NOT NULL | NULL] [DEFAULT default_value] 

比方说

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 

看到它工作SQL Fiddle

+0

领域已经有默认值设定。我需要的是该字段的值将变回0(如果它已更新为其他内容之前),如果有更新完成该行。 – 2013-03-22 22:50:27

+0

啊,我明白了。那么,这是一个触发器的问题,就像@塞巴斯蒂安所暗示的那样。希望混合的答案可以帮助你。 – fedorqui 2013-03-22 22:54:44

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, 'new value')而无需创建一个新的行。

1

使用触发器:

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

没有测试。

+0

是的。这看起来可能有用。我将不得不对如何将这个应用到我的实际用例做更多的研究。谢谢。 – 2013-03-22 22:54:32

+0

我会如何去更新那一行?这好像会更新所有行。我看到了WHERE子句,但是如何将'WHERE id =“只更新行的ID”' – 2013-03-22 22:58:43

+0

我不知道!但我发现这个线程:http://stackoverflow.com/questions/2334478/mysql-triggers-cannot-update-rows-in-same-table-the-trigger-is-assigned-to-sugg它说,我的代码以上将导致无限递归,这是真的。它也有一个解决方案。另一个线程http://stackoverflow.com/questions/9227382/cant-update-table-that-trigger-is-executed-on-in-after-insert说使用'BEFORE'可以做到这一点。 – Sebastian 2013-03-22 23:01:59

0

触发器是正确的选择,但塞巴斯蒂安把这一切都弄错了。

您不会在触发器内运行UPDATE,只需将该值分配给传递给触发器的new记录即可。此外,它已将设置为BEFORE UPDATE触发器(因为之后之后的记录触发器将不会被保留)。

CREATE TRIGGER set_zero 
    BEFORE UPDATE ON table_name 
    FOR EACH ROW 
BEGIN 
    SET new.col_name = 0; 
END; 

请注意,您仍然可以插入即使默认值定义中提供一个非零值。如果你不想,要么,你还需要一个INSERT触发器

下面是一个SQLFiddle例如:http://sqlfiddle.com/#!2/cebe82/1