2009-01-30 29 views
0

我遇到了一個問題,它可以插入一行到表中,而不是專門設置INT NOT NULL列(默認爲0,這對我的目的無效)如何讓某些列沒有設置時mysql無法插入一行?

我以這種方式創建表:

CREATE TABLE inventorycontrol (
    ID       INT NOT NULL UNIQUE AUTO_INCREMENT 
    ,nodeID      INT NOT NULL CHECK (nodeID > 0) 
    ,custom1     VARCHAR(128) NOT NULL DEFAULT '' 
    ,custom2     VARCHAR(128) NOT NULL DEFAULT '' 
    ,custom3     VARCHAR(128) NOT NULL DEFAULT '' 
    ,custom4     VARCHAR(128) NOT NULL DEFAULT '' 
    ,articlekey     VARCHAR(32) NOT NULL 
    ,amount      INT NOT NULL 
    ,orderID     INT NULL 
    ,supplierID     INT NULL 
    ,customerID     INT NULL 
    ,datecreated    DATETIME NOT NULL 
    ,expectedcompletion   DATETIME NOT NULL 
    ,datecompleted    DATETIME NULL 

    ,PRIMARY KEY (articlekey, datecreated) 
) 
GO 

CREATE INDEX ix_InventoryArticle ON inventorycontrol (articlekey) 
GO 

CREATE INDEX ix_InventoryArticle_Custom ON inventorycontrol (nodeID, custom1, custom2, custom3, custom4) 
GO 

CREATE INDEX ix_InventoryAmount ON inventorycontrol (amount) 
GO 

CREATE INDEX ix_InventoryCreated ON inventorycontrol (datecreated) 
GO 

CREATE INDEX ix_InventoryCompleted ON inventorycontrol (datecompleted) 
GO 

ALTER TABLE inventorycontrol 
    ADD FOREIGN KEY fk_nodeID (nodeID) REFERENCES node(ID) 
GO 

我希望此插入失敗:

INSERT INTO inventorycontrol (articlekey, amount, datecreated, expectedcompletion, datecompleted) 
VALUES 
    ('abc', -10, '2009-01-27', '2009-01-27', NULL) 
GO 

不幸的是,這只是工作。 (沒有節點WHERE ID = 0)

有什麼辦法可以強制這個插入失敗創建插入觸發器嗎?

由於提前,

克里斯

附:我正在使用MySQL Ver 14.12 Distrib 5.0.45,用於redhat-linux-gnu(x86_64)使用readline 5.0

回答

3

你需要把MySQL來strict mode

在您的配置文件:

sql-mode="STRICT_ALL_TABLES" 

編輯:

您也可以使用此查詢設置在本地(並把它背):

SET @mode = @@SESSION.sql_mode; 
SET sql_mode = "STRICT_ALL_TABLES"; 

INSERT...; 

SET sql_mode = @mode; 
+0

看起來不錯,但不是一種選擇,服務器上有許多數據庫,我們不能冒險破壞其他任何東西。 – Kris 2009-01-30 11:55:25

-1

設置值NOT NULL,如果這個不工作,並且你不能在插入行之前通過代碼檢查值應該在數據庫存在插入或修改調用時放置新的觸發器來查找值。

希望這有助於!

+0

它被設置爲非空,甚至有一個檢查約束,應該使它不是b e 0以及(雖然似乎沒有工作) – Kris 2009-01-30 11:56:14

相關問題