SET sql_mode = 'traditional'; #------------------------------------------------------------------ # Checking INSERT INTO ... SELECT ... #------------------------------------------------------------------ # - No column list (all columns) + NULL-value for NOT NULL column. CREATE TABLE t1(a INT, b INT NOT NULL) ENGINE=MyISAM; CREATE VIEW v1 AS SELECT * FROM t1; CREATE TABLE t2(a INT, b INT NOT NULL, c INT NOT NULL, d INT NOT NULL) ENGINE=MyISAM; CREATE VIEW v2 AS SELECT * FROM t2; CREATE TABLE t1_data(a INT, b INT) ENGINE=MyISAM; INSERT INTO t1_data VALUES (11, 12), (NULL, 22), (31, NULL), (NULL, NULL); CREATE TABLE t2_data(a INT, b INT, c INT, d INT) ENGINE=MyISAM; INSERT INTO t2_data VALUES (11, 12, 13, 14), (NULL, 22, 23, 24), (31, NULL, 33, 34), (41, 42, NULL, 44), (51, 52, 53, NULL), (NULL, NULL, NULL, NULL); INSERT INTO t1 SELECT * FROM t1_data; ERROR 23000: Column 'b' cannot be null INSERT INTO v1 SELECT a * 10, b * 10 FROM t1_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t1's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t1; a b 11 12 110 120 NULL 22 NULL 220 DELETE FROM t1; REPLACE INTO t1 SELECT * FROM t1_data; ERROR 23000: Column 'b' cannot be null REPLACE INTO v1 SELECT a * 10, b * 10 FROM t1_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t1's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t1; a b 11 12 110 120 NULL 22 NULL 220 DELETE FROM t1; # - No column list (all columns) + NULL-value for NOT NULL column. INSERT INTO t2 SELECT * FROM t2_data; ERROR 23000: Column 'b' cannot be null INSERT INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t2's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t2; a b c d 11 12 13 14 110 120 130 140 NULL 22 23 24 NULL 220 230 240 DELETE FROM t2; # - No column list (all columns) + NULL-value for NOT NULL column. REPLACE INTO t2 SELECT * FROM t2_data; ERROR 23000: Column 'b' cannot be null REPLACE INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t2's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t2; a b c d 11 12 13 14 110 120 130 140 NULL 22 23 24 NULL 220 230 240 DELETE FROM t2; # - All columns + NULL-value for NOT NULL column. INSERT INTO t1(a, b) SELECT * FROM t1_data; ERROR 23000: Column 'b' cannot be null INSERT INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t1's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t1; a b 11 12 110 120 NULL 22 NULL 220 DELETE FROM t1; REPLACE INTO t1(a, b) SELECT * FROM t1_data; ERROR 23000: Column 'b' cannot be null REPLACE INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t1's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t1; a b 11 12 110 120 NULL 22 NULL 220 DELETE FROM t1; INSERT INTO t2(a, b, c, d) SELECT * FROM t2_data; ERROR 23000: Column 'b' cannot be null INSERT INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t2's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t2; a b c d 11 12 13 14 110 120 130 140 NULL 22 23 24 NULL 220 230 240 DELETE FROM t2; REPLACE INTO t2(a, b, c, d) SELECT * FROM t2_data; ERROR 23000: Column 'b' cannot be null REPLACE INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data; ERROR 23000: Column 'b' cannot be null # The following SELECT output should have 4 rows. # t2's engine is MyISAM, so the transaction can not be fully rolled back. SELECT * FROM t2; a b c d 11 12 13 14 110 120 130 140 NULL 22 23 24 NULL 220 230 240 DELETE FROM t2; DROP TABLE t1; DROP TABLE t2; DROP TABLE t1_data; DROP TABLE t2_data; DROP VIEW v1; DROP VIEW v2; "Test for multi table update (across engines)" CREATE TABLE t1(a1 INT NOT NULL, a2 INT) ENGINE = INNODB; CREATE TABLE t2(a1 INT NOT NULL, a2 INT) ENGINE = MyISAM; INSERT INTO t1 VALUES (1, NULL),(2, 2); INSERT INTO t2 VALUES (1, NULL),(2876543, 2098); CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW SET NEW.a1 = 10; CREATE TRIGGER t2_bu BEFORE UPDATE ON t2 FOR EACH ROW SET NEW.a1 = 20; UPDATE t1, t2 SET t1.a1 = NULL , t2.a1 = NULL; SELECT * FROM t1; a1 a2 10 NULL 10 2 SELECT * FROM t2; a1 a2 20 NULL 20 2098 DROP TRIGGER t1_bu; DROP TRIGGER t2_bu; DROP TABLE t1, t2; "Test for multi table update (across engines)" CREATE TABLE t1(a1 INT NOT NULL, a2 INT) ENGINE = INNODB; CREATE TABLE t2(a1 INT NOT NULL, a2 INT) ENGINE = MyISAM; INSERT INTO t1 VALUES (1, NULL),(2, 2); INSERT INTO t2 VALUES (1, NULL),(2876543, 20111098); CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW SET NEW.a1 = NULL; UPDATE t1, t2 SET t1.a1 = 1 , t2.a1 = 2; ERROR 23000: Column 'a1' cannot be null SELECT * FROM t1; a1 a2 1 NULL 2 2 SELECT * FROM t2; a1 a2 1 NULL 2876543 20111098 DROP TRIGGER t1_bu; DROP TABLE t1, t2;