2013-03-22 37 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

相關問題