当没有设置某些列时,如何使mysql无法插入行?

时间:2009-01-30 11:16:02

标签: mysql insert constraints

我遇到了一个问题,即可以在一个表中插入一行而不是专门设置一个INT NOT NULL列(默认为0,这对我的目的无效)

我以这种方式创建表:

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)

有没有办法可以强制插入失败而不是为插入创建触发器?

提前致谢,

克里斯

P.S。我正在使用mysql Ver 14.12 Distrib 5.0.45,对于使用readline 5.0的redhat-linux-gnu(x86_64)

2 个答案:

答案 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;

答案 1 :(得分:-1)

设置值NOT NULL,如果这不起作用,并且在插入行之前无法通过代码检查值,则应该在数据库上存在插入或修改调用时放置查找值的新触发器。

希望这有帮助!