Как сделать так, чтобы mysql не вставлял строку, когда какой-то столбец не установлен? - PullRequest
0 голосов
/ 30 января 2009

Я сталкиваюсь с проблемой, когда возможно вставить строку в таблицу без особой установки столбца 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)

Есть ли способ заставить эту вставку завершиться неудачей, если не создать триггер для вставок?

Заранее спасибо,

Kris

P.S. я использую mysql Ver 14.12 Distrib 5.0.45, для redhat-linux-gnu (x86_64) используя readline 5.0

Ответы [ 2 ]

3 голосов
/ 30 января 2009

Вам нужно перевести MySQL в строгий режим

В вашем конфигурационном файле:

sql-mode="STRICT_ALL_TABLES"

EDIT:

Вы также можете установить его локально (и вернуть обратно), используя этот запрос:

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

INSERT...;

SET sql_mode = @mode;
0 голосов
/ 30 января 2009

Установите значения NOT NULL, если это не работает, и вы не можете проверить значения по коду перед вставкой строки, вы должны установить новые триггеры, которые ищут значения, когда в вашей базе данных есть вызов вставки или изменения.

надеюсь, это поможет!

...