mirror of
https://github.com/MariaDB/server.git
synced 2025-02-05 05:12:17 +01:00
1028 lines
30 KiB
Text
1028 lines
30 KiB
Text
set default_storage_engine=innodb;
|
|
#
|
|
# Bug#22469130: FOREIGN KEY ON DELETE CASCADE NOT ALLOWED
|
|
# WHEN A VIRTUAL INDEX EXISTS.
|
|
# UPDATE CASCADE
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# UPDATE SET NULL
|
|
CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY,
|
|
KEY(fld1));
|
|
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE SET NULL);
|
|
INSERT INTO t1 VALUES(1, 2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
NULL
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
NULL NULL
|
|
DROP TABLE t2, t1;
|
|
# DELETE CASCADE
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t1 VALUES(2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
INSERT INTO t2 VALUES(2, DEFAULT);
|
|
DELETE FROM t1 WHERE fld1= 1;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# DELETE SET NULL
|
|
CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY, KEY(fld1));
|
|
CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE SET NULL);
|
|
INSERT INTO t1 VALUES(1, 1);
|
|
INSERT INTO t1 VALUES(2, 2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
INSERT INTO t2 VALUES(2, DEFAULT);
|
|
DELETE FROM t1 WHERE fld1= 1;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
NULL
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
NULL NULL
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# VIRTUAL INDEX CONTAINS FK CONSTRAINT COLUMN
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT, fld3 INT AS (fld2) VIRTUAL,
|
|
KEY(fld3, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1, fld2) VALUES(1, 3);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
3 2
|
|
SELECT * FROM t2;
|
|
fld1 fld2 fld3
|
|
2 3 3
|
|
DROP TABLE t2, t1;
|
|
# Multiple level of VIRTUAL columns.
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY(fld3), KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1) VALUES(1);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT fld3 FROM t2;
|
|
fld3
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2 fld3
|
|
2 2 2
|
|
DROP TABLE t2, t1;
|
|
# Drop the VIRTUAL INDEX using alter copy ALGORITHM
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY vk(fld2),
|
|
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1) VALUES(1);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
2 2
|
|
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
3 3
|
|
DROP TABLE t2, t1;
|
|
# Drop the VIRTUAL INDEX using INPLACE alter ALGORITHM
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
KEY vk(fld2), KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1) VALUES(1);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
2 2
|
|
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
3 3
|
|
DROP TABLE t2, t1;
|
|
# Add the VIRTUAL INDEX using COPY alter ALGORITHM
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1) VALUES(1);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
2 2
|
|
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= COPY;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
3 3
|
|
DROP TABLE t2, t1;
|
|
# Add the VIRTUAL INDEX using INPLACE alter ALGORITHM
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1) VALUES(1);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
2 2
|
|
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= INPLACE;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
3 3
|
|
DROP TABLE t2, t1;
|
|
# Drop the VIRTUAL INDEX contains fk constraint column
|
|
# using alter copy ALGORITHM
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
|
|
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 2
|
|
ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 3
|
|
DROP TABLE t2, t1;
|
|
# Drop the VIRTUAL INDEX which contains fk constraint column
|
|
# using INPLACE alter operation
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
|
|
KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 2
|
|
alter TABLE t2 DROP INDEX vk, ALGORITHM= INPLACE;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 3
|
|
DROP TABLE t2, t1;
|
|
# Add the VIRTUAL INDEX contains fk constraint column
|
|
# using copy alter operatiON
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY(fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
|
|
INSERT INTO t1(fld1) VALUES(1);
|
|
INSERT INTO t2(fld1, fld2) VALUES(1, 2);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 2
|
|
alter TABLE t2 ADD INDEX vk(fld3, fld1), ALGORITHM= COPY;
|
|
UPDATE t1 SET fld1= 3;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 3
|
|
DROP TABLE t2, t1;
|
|
# Cascading UPDATEs and DELETEs for the multiple
|
|
# fk dependent TABLEs
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld1), KEY(fld2, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
|
|
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld2, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2(fld1) VALUES(1), (2);
|
|
INSERT INTO t3(fld1) VALUES(1), (2);
|
|
UPDATE t1 SET fld1= 4 WHERE fld1= 1;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
2 2
|
|
4 4
|
|
SELECT fld2, fld1 FROM t3;
|
|
fld2 fld1
|
|
2 2
|
|
4 4
|
|
DROP TABLE t3, t2, t1;
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1), KEY(fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
|
|
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
|
|
INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
|
|
UPDATE t1 SET fld1= 4 WHERE fld1= 1;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
1 4
|
|
2 2
|
|
SELECT fld3, fld1 FROM t3;
|
|
fld3 fld1
|
|
1 4
|
|
2 2
|
|
DROP TABLE t3, t2, t1;
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld1), KEY(fld2, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
|
|
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld2, fld1), FOREIGN KEY(fld1) REFERENCES t2(fld1)
|
|
ON DELETE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2(fld1) VALUES(1), (2);
|
|
INSERT INTO t3(fld1) VALUES(1), (2);
|
|
DELETE FROM t1 WHERE fld1= 1;
|
|
SELECT fld2, fld1 FROM t2;
|
|
fld2 fld1
|
|
2 2
|
|
SELECT fld2, fld1 FROM t3;
|
|
fld2 fld1
|
|
2 2
|
|
DROP TABLE t3, t2, t1;
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL,
|
|
KEY(fld3, fld1), KEY(fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON DELETE CASCADE);
|
|
CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
|
|
fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t2(fld1)
|
|
ON DELETE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
|
|
INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
|
|
DELETE FROM t1 WHERE fld1= 1;
|
|
SELECT fld3, fld1 FROM t2;
|
|
fld3 fld1
|
|
2 2
|
|
SELECT fld3, fld1 FROM t3;
|
|
fld3 fld1
|
|
2 2
|
|
DROP TABLE t3, t2, t1;
|
|
# RENAME TABLE
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
KEY(fld2, fld1),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON DELETE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
|
|
RENAME TABLE t2 to t3;
|
|
DELETE FROM t1 WHERE fld1= 1;
|
|
SELECT fld2, fld1 FROM t3;
|
|
fld2 fld1
|
|
2 2
|
|
DROP TABLE t3, t1;
|
|
# FOREIGN_KEY_CHECKS disabled DURING INPLACE ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM=INPLACE;
|
|
SET foreign_key_checks = 1;
|
|
UPDATE t1 SET fld1= 3 WHERE fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
3
|
|
DROP TABLE t2, t1;
|
|
# GENERATED COLUMN COMPUTATION FAILS when SQL_MODE
|
|
# is set to ERROR_FOR_DIVISION_BY_ZERO
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (100/fld1) VIRTUAL,
|
|
KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
|
|
UPDATE IGNORE t1 SET fld1= 0 WHERE fld1= 2;
|
|
Warnings:
|
|
Warning 1365 Division by 0
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
NULL
|
|
100
|
|
DROP TABLE t2, t1;
|
|
# CHANGE SQL_MODE and try the ERROR_FOR_DIVISION_BY_ZERO
|
|
SET sql_mode = STRICT_ALL_TABLES;
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (100/fld1) VIRTUAL,
|
|
KEY(fld2),
|
|
FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1), (2);
|
|
INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
|
|
UPDATE t1 SET fld1= 0 WHERE fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
NULL
|
|
100
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 100
|
|
0 NULL
|
|
DROP TABLE t2, t1;
|
|
SET sql_mode = default;
|
|
# ADD FOREIGN CONSTRAINT USING COPY
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
|
|
ALTER TABLE t2 ADD FOREIGN KEY (fld1)
|
|
REFERENCES t1(fld1) ON UPDATE CASCADE,
|
|
ALGORITHM=copy;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# ADD FOREIGN CONSTRAINT USING INPLACE
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 ADD FOREIGN KEY (fld1)
|
|
REFERENCES t1(fld1) ON UPDATE CASCADE,
|
|
ALGORITHM=inplace;
|
|
SET foreign_key_checks = 1;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# DROP FOREIGN CONSTRAINT USING COPY
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
|
|
CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=COPY;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 1
|
|
DROP TABLE t2, t1;
|
|
# DROP FOREIGN CONSTRAINT USING INPLACE
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
|
|
CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
|
|
SET foreign_key_checks = 1;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 1
|
|
DROP TABLE t2, t1;
|
|
# ADD VC INDEX and ADD FK IN SAME COPY ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE, ALGORITHM=copy;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# ADD VC INDEX and ADD FK IN SAME INPLACE ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE, ALGORITHM=inplace;
|
|
SET foreign_key_checks = 1;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# ADD VC INDEX and DROP FK IN SAME COPY ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=copy;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 1
|
|
DROP TABLE t2, t1;
|
|
# ADD VC INDEX and DROP FK IN SAME INPLACE ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=inplace;
|
|
SET foreign_key_checks = 1;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 1
|
|
DROP TABLE t2, t1;
|
|
# DROP VC INDEX and ADD FK IN SAME COPY ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
KEY idx(fld2));
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE, ALGORITHM=COPY;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# DROP VC INDEX and ADD FK IN SAME INPLACE ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
KEY idx(fld2));
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE, ALGORITHM=INPLACE;
|
|
SET foreign_key_checks = 1;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
2
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
# DROP VC INDEX and DROP FK IN SAME COPY ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
KEY idx(fld2),
|
|
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=COPY;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 1
|
|
DROP TABLE t2, t1;
|
|
# DROP VC INDEX and DROP FK IN SAME INPLACE ALTER
|
|
CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
|
|
CREATE TABLE t2(fld1 INT NOT NULL,
|
|
fld2 INT AS (fld1) VIRTUAL,
|
|
KEY idx(fld2),
|
|
CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
|
|
ON UPDATE CASCADE);
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2 VALUES(1, DEFAULT);
|
|
SET foreign_key_checks = 0;
|
|
ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
|
|
SET foreign_key_checks = 1;
|
|
UPDATE t1 SET fld1= 2;
|
|
SELECT fld2 FROM t2;
|
|
fld2
|
|
1
|
|
SELECT * FROM t2;
|
|
fld1 fld2
|
|
1 1
|
|
DROP TABLE t2, t1;
|
|
CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
|
|
CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
|
|
KEY (f1, f2), FOREIGN KEY(f1) REFERENCES t1(f1))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2(f1) VALUES(1);
|
|
EXPLAIN SELECT f1, f2 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL f1 9 NULL 1 Using index
|
|
SELECT f1, f2 FROM t2;
|
|
f1 f2
|
|
1 1
|
|
INSERT INTO t2(f1) VALUES(2);
|
|
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`))
|
|
DROP TABLE t2, t1;
|
|
CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
|
|
CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
|
|
KEY (f1, f2), FOREIGN KEY(f1) REFERENCES t1(f1)
|
|
ON UPDATE CASCADE)ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2(f1) VALUES(1);
|
|
EXPLAIN SELECT f1, f2 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL f1 9 NULL 1 Using index
|
|
SELECT f1, f2 FROM t2;
|
|
f1 f2
|
|
1 1
|
|
UPDATE t1 SET f1 = 2 WHERE f1 = 1;
|
|
EXPLAIN SELECT f1, f2 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL f1 9 NULL 1 Using index
|
|
SELECT f1, f2 FROM t2;
|
|
f1 f2
|
|
2 2
|
|
DROP TABLE t2, t1;
|
|
CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
|
|
CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
|
|
KEY (f1, f2))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2(f1) VALUES(1);
|
|
SET FOREIGN_KEY_CHECKS = 0;
|
|
ALTER TABLE t2 ADD FOREIGN KEY (f1) REFERENCES t1(f1)
|
|
ON UPDATE CASCADE, ALGORITHM=INPLACE;
|
|
SET FOREIGN_KEY_CHECKS = 1;
|
|
UPDATE t1 SET f1 = 3;
|
|
EXPLAIN SELECT f1, f2 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL f1 9 NULL 1 Using index
|
|
SELECT f1, f2 FROM t2;
|
|
f1 f2
|
|
3 3
|
|
DROP TABLE t2, t1;
|
|
CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
|
|
CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
|
|
KEY (f1, f2))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2(f1) VALUES(1);
|
|
ALTER TABLE t2 ADD FOREIGN KEY (f1) REFERENCES t1(f1)
|
|
ON UPDATE CASCADE, ALGORITHM=COPY;
|
|
UPDATE t1 SET f1 = 3;
|
|
EXPLAIN SELECT f1, f2 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL f1 9 NULL 1 Using index
|
|
SELECT f1, f2 FROM t2;
|
|
f1 f2
|
|
3 3
|
|
DROP TABLE t2, t1;
|
|
CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
|
|
CREATE TABLE t2(f1 INT NOT NULL, f2 INT AS (1) VIRTUAL,
|
|
f3 INT AS (2) VIRTUAL,
|
|
FOREIGN KEY idx (f1) REFERENCES t1(f1) ON UPDATE CASCADE,
|
|
KEY idx1 (f2, f1, f3))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2(f1) VALUES(1);
|
|
ALTER TABLE t2 DROP COLUMN f2, ALGORITHM=INPLACE;
|
|
UPDATE t1 SET f1 = 3;
|
|
EXPLAIN SELECT f1, f3 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL idx1 9 NULL 1 Using index
|
|
SELECT f1, f3 FROM t2;
|
|
f1 f3
|
|
3 2
|
|
DROP TABLE t2, t1;
|
|
CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
|
|
CREATE TABLE t2(f1 INT NOT NULL, f2 INT AS (1) VIRTUAL,
|
|
f3 INT AS (2) VIRTUAL,
|
|
FOREIGN KEY idx (f1) REFERENCES t1(f1) ON UPDATE CASCADE,
|
|
KEY idx1 (f2, f1, f3))ENGINE=INNODB;
|
|
INSERT INTO t1 VALUES(1);
|
|
INSERT INTO t2(f1) VALUES(1);
|
|
ALTER TABLE t2 DROP COLUMN f2, ALGORITHM=COPY;
|
|
UPDATE t1 SET f1 = 3;
|
|
EXPLAIN SELECT f1, f3 FROM t2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 index NULL idx1 9 NULL 1 Using index
|
|
SELECT f1, f3 FROM t2;
|
|
f1 f3
|
|
3 2
|
|
DROP TABLE t2, t1;
|
|
#
|
|
# MDEV-15553 Assertion failed in dict_table_get_col_name
|
|
#
|
|
CREATE TABLE t1 (
|
|
c1 TIMESTAMP,
|
|
c2 YEAR,
|
|
c3 TIME,
|
|
c4 CHAR(10),
|
|
v1 TIMESTAMP AS (c1) VIRTUAL,
|
|
v2 YEAR AS (c2) VIRTUAL,
|
|
v3 TIME AS (c3) VIRTUAL,
|
|
v4 CHAR(10) AS (c4) VIRTUAL
|
|
) ENGINE=InnoDB;
|
|
ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
|
|
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
SET foreign_key_checks=0;
|
|
ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
|
|
ERROR HY000: Failed to add the foreign key constraint. Missing index for constraint 'fk' in the foreign table 't1'
|
|
ALTER TABLE t1 ADD INDEX(v4);
|
|
ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
|
|
SET foreign_key_checks=1;
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
|
`c2` year(4) DEFAULT NULL,
|
|
`c3` time DEFAULT NULL,
|
|
`c4` char(10) DEFAULT NULL,
|
|
`v1` timestamp GENERATED ALWAYS AS (`c1`) VIRTUAL,
|
|
`v2` year(4) GENERATED ALWAYS AS (`c2`) VIRTUAL,
|
|
`v3` time GENERATED ALWAYS AS (`c3`) VIRTUAL,
|
|
`v4` char(10) GENERATED ALWAYS AS (`c4`) VIRTUAL,
|
|
KEY `v4` (`v4`),
|
|
CONSTRAINT `fk` FOREIGN KEY (`v4`) REFERENCES `nosuch` (`col`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
ALTER TABLE t1 DROP FOREIGN KEY fk;
|
|
ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
|
|
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
|
`c2` year(4) DEFAULT NULL,
|
|
`c3` time DEFAULT NULL,
|
|
`c4` char(10) DEFAULT NULL,
|
|
`v1` timestamp GENERATED ALWAYS AS (`c1`) VIRTUAL,
|
|
`v2` year(4) GENERATED ALWAYS AS (`c2`) VIRTUAL,
|
|
`v3` time GENERATED ALWAYS AS (`c3`) VIRTUAL,
|
|
`v4` char(10) GENERATED ALWAYS AS (`c4`) VIRTUAL,
|
|
KEY `v4` (`v4`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
DROP TABLE t1;
|
|
#
|
|
# MDEV-20396 Server crashes after DELETE with SEL NULL Foreign key and a
|
|
# virtual column in index
|
|
#
|
|
CREATE TABLE parent
|
|
(
|
|
ID int unsigned NOT NULL,
|
|
PRIMARY KEY (ID)
|
|
);
|
|
CREATE TABLE child
|
|
(
|
|
ID int unsigned NOT NULL,
|
|
ParentID int unsigned NULL,
|
|
Value int unsigned NOT NULL DEFAULT 0,
|
|
Flag int unsigned AS (Value) VIRTUAL,
|
|
PRIMARY KEY (ID),
|
|
KEY (ParentID, Flag),
|
|
FOREIGN KEY (ParentID) REFERENCES parent (ID) ON DELETE SET NULL
|
|
ON UPDATE CASCADE
|
|
);
|
|
INSERT INTO parent (ID) VALUES (100);
|
|
INSERT INTO child (ID,ParentID,Value) VALUES (123123,100,1);
|
|
DELETE FROM parent WHERE ID=100;
|
|
select * from child;
|
|
ID ParentID Value Flag
|
|
123123 NULL 1 1
|
|
INSERT INTO parent (ID) VALUES (100);
|
|
UPDATE child SET ParentID=100 WHERE ID=123123;
|
|
DROP TABLE child, parent;
|
|
#
|
|
# MDEV-23387 dict_load_foreign() fails to load the table during alter
|
|
#
|
|
SET FOREIGN_KEY_CHECKS=0;
|
|
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
|
f3 INT AS (f1) VIRTUAL,
|
|
INDEX(f1), INDEX(f2))ENGINE=InnoDB;
|
|
ALTER TABLE t1 ADD CONSTRAINT r FOREIGN KEY(f2) REFERENCES t1(f1), LOCK=NONE;
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`f1` int(11) NOT NULL,
|
|
`f2` int(11) NOT NULL,
|
|
`f3` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL,
|
|
KEY `f1` (`f1`),
|
|
KEY `f2` (`f2`),
|
|
CONSTRAINT `r` FOREIGN KEY (`f2`) REFERENCES `t1` (`f1`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
ALTER TABLE t1 DROP INDEX f1;
|
|
ALTER TABLE t1 DROP f3;
|
|
DROP TABLE t1;
|
|
#
|
|
# MDEV-24041 Generated column DELETE with FOREIGN KEY crash InnoDB
|
|
#
|
|
SET FOREIGN_KEY_CHECKS=1;
|
|
CREATE DATABASE `a-b`;
|
|
USE `a-b`;
|
|
CREATE TABLE emails (
|
|
id int,
|
|
PRIMARY KEY (id)
|
|
) ENGINE=InnoDB;
|
|
CREATE TABLE email_stats (
|
|
id int,
|
|
email_id int,
|
|
date_sent char(4),
|
|
generated_email_id int as (email_id),
|
|
#generated_sent_date DATE GENERATED ALWAYS AS (date_sent),
|
|
PRIMARY KEY (id),
|
|
KEY mautic_generated_sent_date_email_id (generated_email_id),
|
|
FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
|
|
ON UPDATE CASCADE
|
|
) ENGINE=InnoDB;
|
|
CREATE TABLE emails_metadata (
|
|
email_id int,
|
|
PRIMARY KEY (email_id),
|
|
CONSTRAINT FK FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE CASCADE
|
|
ON UPDATE CASCADE
|
|
) ENGINE=InnoDB;
|
|
INSERT INTO emails VALUES (1);
|
|
INSERT INTO email_stats (id, email_id, date_sent) VALUES (1,1,'Jan');
|
|
INSERT INTO emails_metadata VALUES (1);
|
|
UPDATE emails SET id=2;
|
|
DELETE FROM emails;
|
|
DROP TABLE email_stats;
|
|
DROP TABLE emails_metadata;
|
|
DROP TABLE emails;
|
|
DROP DATABASE `a-b`;
|
|
USE test;
|
|
#
|
|
# Bug#33053297 VIRTUAL INDEX CORRUPTED DURING CASCADE UPDATE ON CHILD TABLE
|
|
#
|
|
# Test-Case 1
|
|
CREATE TABLE emails (
|
|
id int unsigned NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (id)
|
|
) ENGINE=InnoDB;
|
|
CREATE TABLE email_stats (
|
|
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
email_id int unsigned DEFAULT NULL,
|
|
date_sent datetime NOT NULL,
|
|
generated_sent_date date GENERATED ALWAYS AS
|
|
(concat(year(date_sent), '-', lpad(month(date_sent), 2, '0'),
|
|
'-', lpad(dayofmonth(date_sent), 2, '0'))),
|
|
PRIMARY KEY (id),
|
|
KEY IDX_ES1 (email_id),
|
|
KEY mautic_generated_sent_date_email_id(generated_sent_date, email_id),
|
|
FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
|
|
) ENGINE = InnoDB;
|
|
INSERT INTO emails VALUES (1);
|
|
INSERT INTO email_stats (id, email_id, date_sent)
|
|
VALUES (1, 1, '2020-10-22 13:32:41');
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_date
|
|
1 1 2020-10-22 13:32:41 2020-10-22
|
|
DELETE FROM emails;
|
|
DELETE FROM email_stats;
|
|
# Clean up.
|
|
DROP TABLE email_stats;
|
|
DROP TABLE emails;
|
|
# Test-Case 2
|
|
CREATE TABLE emails (
|
|
id int unsigned NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (id)
|
|
) ENGINE = InnoDB
|
|
DEFAULT CHARSET = utf8mb4
|
|
COLLATE = utf8mb4_unicode_ci
|
|
ROW_FORMAT = DYNAMIC;
|
|
CREATE TABLE email_stats (
|
|
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
email_id int unsigned DEFAULT NULL,
|
|
date_sent datetime NOT NULL,
|
|
generated_sent_date date GENERATED ALWAYS AS
|
|
(concat(year(date_sent), '-', lpad(month(date_sent), 2, '0'),
|
|
'-', lpad(dayofmonth(date_sent), 2, '0'))),
|
|
PRIMARY KEY (id),
|
|
KEY IDX_ES1 (email_id),
|
|
KEY mautic_generated_sent_date_email_id(generated_sent_date, email_id),
|
|
FOREIGN KEY (email_id) REFERENCES emails (id)
|
|
ON DELETE SET NULL
|
|
ON UPDATE SET NULL
|
|
) ENGINE = InnoDB;
|
|
INSERT INTO emails VALUES (1);
|
|
INSERT INTO email_stats (id, email_id, date_sent)
|
|
VALUES (1, 1, '2020-10-22 13:32:41');
|
|
UPDATE emails SET id = 2 where id = 1;
|
|
SELECT id FROM email_stats WHERE generated_sent_date IS NULL;
|
|
id
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_date
|
|
1 NULL 2020-10-22 13:32:41 2020-10-22
|
|
UPDATE email_stats
|
|
SET email_id=2
|
|
WHERE DATE(generated_sent_date) = '2020-10-22';
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_date
|
|
1 2 2020-10-22 13:32:41 2020-10-22
|
|
# Clean up.
|
|
DROP TABLE email_stats;
|
|
DROP TABLE emails;
|
|
# Test-case 3
|
|
CREATE TABLE emails (
|
|
id int unsigned NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (id)
|
|
) ENGINE = INNODB
|
|
DEFAULT CHARSET = utf8mb4
|
|
COLLATE = utf8mb4_unicode_ci
|
|
ROW_FORMAT = DYNAMIC;
|
|
CREATE TABLE email_stats (
|
|
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
email_id int unsigned DEFAULT NULL,
|
|
date_sent datetime NOT NULL,
|
|
generated_sent_email varchar(20) GENERATED ALWAYS AS
|
|
(CONCAT(YEAR(date_sent), '-', COALESCE(email_id, '$'))),
|
|
PRIMARY KEY (id),
|
|
KEY idx_es1 (email_id),
|
|
KEY mautic_generated_sent_date_email(generated_sent_email, email_id),
|
|
FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
|
|
) ENGINE = INNODB;
|
|
INSERT INTO emails VALUES (1);
|
|
INSERT INTO email_stats (id, email_id, date_sent)
|
|
VALUES (1, 1, '2020-10-22 13:32:41');
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_email
|
|
1 1 2020-10-22 13:32:41 2020-1
|
|
SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
DELETE FROM emails;
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_email
|
|
1 NULL 2020-10-22 13:32:41 2020-$
|
|
SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-$';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
# Clean up.
|
|
DROP TABLE email_stats;
|
|
DROP TABLE emails;
|
|
# Test-case 4
|
|
CREATE TABLE emails (
|
|
id int unsigned NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (id)
|
|
) ENGINE = INNODB;
|
|
CREATE TABLE email_stats (
|
|
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
email_id int unsigned DEFAULT NULL,
|
|
date_sent datetime NOT NULL,
|
|
generated_sent_email varchar(20) GENERATED ALWAYS AS
|
|
(CONCAT(YEAR(date_sent), '-', COALESCE(email_id, '$'))),
|
|
PRIMARY KEY (id),
|
|
KEY idx_es1 (email_id),
|
|
KEY mautic_generated_sent_date_email(generated_sent_email, email_id),
|
|
FOREIGN KEY (email_id) REFERENCES emails (id) ON UPDATE SET NULL
|
|
) ENGINE = INNODB;
|
|
INSERT INTO emails VALUES (1);
|
|
INSERT INTO email_stats (id, email_id, date_sent)
|
|
VALUES (1, 1, '2020-10-22 13:32:41');
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_email
|
|
1 1 2020-10-22 13:32:41 2020-1
|
|
SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
UPDATE emails SET id = 2 WHERE id = 1;
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_email
|
|
1 NULL 2020-10-22 13:32:41 2020-$
|
|
SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-$';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
DROP TABLE email_stats;
|
|
DROP TABLE emails;
|
|
CREATE TABLE emails (breaker int unsigned,
|
|
KEY (breaker),
|
|
id int unsigned NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (id)
|
|
) ENGINE=INNODB;
|
|
CREATE TABLE email_stats (
|
|
id bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
email_id int unsigned DEFAULT NULL,
|
|
date_sent datetime NOT NULL,
|
|
generated_sent_email varchar(20) GENERATED ALWAYS AS
|
|
(CONCAT(YEAR(date_sent),
|
|
'-',
|
|
COALESCE(email_id, '$'))),
|
|
PRIMARY KEY (id),
|
|
KEY idx_es1 (email_id),
|
|
KEY mautic_generated_sent_date_email (generated_sent_email, email_id),
|
|
FOREIGN KEY fk_ea1 (email_id) REFERENCES emails (breaker)
|
|
ON DELETE SET NULL
|
|
) ENGINE=INNODB;
|
|
show create table email_stats;
|
|
Table Create Table
|
|
email_stats CREATE TABLE `email_stats` (
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
|
`email_id` int(10) unsigned DEFAULT NULL,
|
|
`date_sent` datetime NOT NULL,
|
|
`generated_sent_email` varchar(20) GENERATED ALWAYS AS (concat(year(`date_sent`),'-',coalesce(`email_id`,'$'))) VIRTUAL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `idx_es1` (`email_id`),
|
|
KEY `mautic_generated_sent_date_email` (`generated_sent_email`,`email_id`),
|
|
CONSTRAINT `fk_ea1` FOREIGN KEY (`email_id`) REFERENCES `emails` (`breaker`) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
INSERT INTO emails VALUES (1,1);
|
|
INSERT INTO email_stats(id, email_id, date_sent)
|
|
VALUES (1, 1, '2020-10-22 13:32:41');
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_email
|
|
1 1 2020-10-22 13:32:41 2020-1
|
|
SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
DELETE FROM emails;
|
|
SELECT * FROM email_stats;
|
|
id email_id date_sent generated_sent_email
|
|
1 NULL 2020-10-22 13:32:41 2020-$
|
|
SELECT date_sent
|
|
FROM email_stats force index (mautic_generated_sent_date_email)
|
|
WHERE generated_sent_email = '2020-$';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
SELECT date_sent
|
|
FROM email_stats force index (idx_es1)
|
|
WHERE generated_sent_email = '2020-$';
|
|
date_sent
|
|
2020-10-22 13:32:41
|
|
DROP TABLE email_stats;
|
|
DROP TABLE emails;
|