Ниже описывается, как я пишу свою миграцию SQL для приложения, которое я разрабатываю.
ALTER
текущая таблица и RENAME
она с суффиксом _old
. CREATE
новая таблица с измененной схемой. INSERT
значения из старой таблицы.
Это мой запрос на миграцию:
/* Registration */
ALTER TABLE registration RENAME TO registration_old;
CREATE TABLE IF NOT EXISTS registration (
registration_id INTEGER PRIMARY KEY,
kid_id INTEGER,
mode_of_payment STRING,
online_payment_status STRING,
payment_id STRING,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
event_id INTEGER,
consent_signature STRING DEFAULT NULL,
UNIQUE (kid_id, event_id)
FOREIGN KEY(event_id) REFERENCES event(event_id)
ON UPDATE CASCADE ON DELETE SET NULL
FOREIGN KEY(kid_id) REFERENCES kid(kid_id)
ON UPDATE CASCADE ON DELETE NO ACTION
);
INSERT INTO registration (
registration_id, kid_id, mode_of_payment,
online_payment_status, payment_id,
timestamp, event_id, consent_signature)
SELECT
registration_id, kid_id, mode_of_payment,
online_payment_status, payment_id,
timestamp, event_id, consent_signature
FROM
registration_old;
DROP TABLE registration_old;
/* User */
ALTER TABLE user RENAME TO user_old;
CREATE TABLE IF NOT EXISTS user (
user_id INTEGER PRIMARY KEY,
user_name STRING,
user_email STRING,
user_pwd_hash STRING,
user_first_name STRING,
user_last_name STRING,
user_role_id INTEGER DEFAULT 4,
parent_id INTEGER DEFAULT NULL,
confirmation_status STRING DEFAULT False,
creation_time DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(user_role_id) REFERENCES user_role(user_role_id)
ON UPDATE CASCADE ON DELETE SET DEFAULT
FOREIGN KEY(parent_id) REFERENCES parent(parent_id)
ON UPDATE CASCADE ON DELETE SET DEFAULT
UNIQUE (user_name)
UNIQUE (user_email)
);
INSERT INTO user (
user_id, user_name, user_email,
user_pwd_hash, user_first_name,
user_last_name, user_role_id,
confirmation_status)
SELECT
user_id, user_name, user_email,
user_pwd_hash, user_first_name,
user_last_name, user_role_id,
confirmation_status
FROM
user_old;
DROP TABLE user_old;
При запуске я получаю следующую ошибку в строке DROP TABLE user_old
.
Result: no such table: main.registration_old
At line 69:
DROP TABLE user_old;
Теперь я не понимаю, почему DROP TABLE user_old
вызывает то, что требует registration_old
. Как они вообще связаны? Я также попытался запустить их по отдельности. Регистрация блок запроса выполняется без ошибок, но когда я запускаю user block, возникает та же ошибка.