2009-01-30 7 views
0

Je suis en cours d'exécution dans un problème où il est possible d'insérer une ligne dans une table whithout réglage spécifique INT colonne NOT NULL (0 par défaut qui est valide pour mes besoins)Comment faire mysql échouer à insérer une ligne quand une colonne n'est pas définie?

Je crée la table de cette façon:

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 

j'attendre cet insert à l'échec:

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

Malheureusement, cela fonctionne. (il n'y a pas de nœud WHERE ID = 0)

Y at-il un moyen de forcer cette insertion à échouer à court de créer un déclencheur pour les insertions?

Merci à l'avance,

Kris

post-scriptum J'utilise mysql Ver 14.12 Distrib 5.0.45, pour redhat-linux-gnu (x86_64) en utilisant readline 5.0

Répondre

3

Vous devez mettre MySQL en strict mode

Dans votre fichier de configuration:

sql-mode="STRICT_ALL_TABLES" 

EDIT:

Vous pouvez également définir localement (et la remettre) en utilisant cette requête:

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

INSERT...; 

SET sql_mode = @mode; 
+0

Cela semble bien mais n'est pas une option, il y a beaucoup de bases de données sur le serveur et nous ne pouvons pas risquer de casser quoi que ce soit d'autre. – Kris

+0

La modification semble bonne, mais malheureusement, je ne serai probablement pas le gars qui fait les INSERT réels. Je lis sur le concept, peut-être que je peux réécrire les spécifications pour permettre les déclencheurs. (les déclencheurs sont problématiques à copier de db à db) – Kris

+0

Je pense que si vous ne pouvez pas changer le SQL ou la configuration du serveur, les déclencheurs sont tout ce qui reste – Greg

-1

Définissez les valeurs NOT NULL, si cela ne fonctionne pas et vous ne pouvez pas vérifier les valeurs par code avant d'insérer la ligne vous devrait mettre de nouveaux déclencheurs qui recherchent des valeurs quand il y a un appel d'insertion ou un appel de modification sur votre base de données.

espérons que cela aide!

+0

Il est défini comme NOT NULL et il y a même une contrainte de vérification qui devrait le rendre non b e 0 aussi (cela ne semble pas fonctionner) – Kris

Questions connexes