代码之家  ›  专栏  ›  技术社区  ›  Kris

如果没有设置列,如何使MySQL无法插入行?

  •  0
  • Kris  · 技术社区  · 16 年前

    我遇到了一个问题,在这个问题中,可以在表中插入一行,而不需要专门设置int非空列(默认值为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
    

    不幸的是,这是可行的。(没有id=0的节点)

    如果不为插入创建触发器,是否有任何方法可以强制此插入失败?

    事先谢谢,

    克里斯

    另外,我使用的是MySQLver14.12发行版5.0.45,用于Redhat Linux GNU(x86_),使用的是readline 5.0。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Greg    16 年前

    你需要把mysql放到 strict mode

    在配置文件中:

    sql-mode="STRICT_ALL_TABLES"
    

    编辑:

    您还可以使用此查询在本地设置它(并将其放回):

    SET @mode = @@SESSION.sql_mode;
    SET sql_mode = "STRICT_ALL_TABLES";
    
    INSERT...;
    
    SET sql_mode = @mode;
    
        2
  •  -1
  •   Polo    16 年前

    将值设置为不为空,如果这不起作用,并且在插入行之前无法通过代码检查值,则应放置新的触发器,以便在数据库上有insert或modify调用时查找值。

    希望这有帮助!