ALTER TABLE on a parent table deletes child rows through ON DELETE CASCADE
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 35/100
Piste de recherche
Start by reading the driver's ALTER TABLE handling and transaction wrapper, then inspect how they manage SQLite foreign key settings around table recreation. The reproduction shows child rows are deleted after adding a column; verify behavior with the provided SQL, including inside a transaction. The issue asks maintainers to decide whether to emulate MySQL's implicit DDL commits, so implementation scope and expected transaction behavior need agreement first.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Reproduction
CREATE TABLE parent (id INT PRIMARY KEY);
CREATE TABLE child (id INT, pid INT, FOREIGN KEY (pid) REFERENCES parent (id) ON DELETE CASCADE);
INSERT INTO parent VALUES (1), (2);
INSERT INTO child VALUES (10, 1), (20, 2);
ALTER TABLE parent ADD COLUMN name TEXT;
SELECT COUNT(*) FROM child;
-- 0 (MySQL: 2)
Reproduced on trunk (3.1.0) with PHP 8.3 and SQLite 3.45.1, with stringified fetches on, as in WordPress. It also happens when the ALTER TABLE runs inside START TRANSACTION ... COMMIT. With ON DELETE SET NULL, the child rows lose their references instead.
Cause
ALTER TABLE recreates the table: it creates a new table, copies the rows, drops the old table, and renames the new one. Before that, it runs PRAGMA foreign_keys = OFF, as the SQLite procedure requires. But the statement runs inside the driver's wrapper transaction, and PRAGMA foreign_keys is a no-op inside a transaction. Foreign keys stay on, so DROP TABLE performs an implicit DELETE of the old table, which fires the foreign key actions of the child tables.
Related
The same implicit DELETE affects two statements that MySQL rejects for a referenced parent table:
DROP TABLE parentdeletes the child rows. MySQL fails with error 3730 (ER_FK_CANNOT_DROP_PARENT).TRUNCATE TABLE parentdeletes the child rows. MySQL fails with error 1701 (ER_TRUNCATE_ILLEGAL_FK).
A related transaction difference: MySQL implicitly commits an open transaction before and after DDL statements, but the driver runs them inside the user transaction, so a ROLLBACK undoes them together with the earlier work:
START TRANSACTION;
INSERT INTO t VALUES (1);
CREATE TABLE u (id INT);
ROLLBACK;
-- Driver: t is empty, and u doesn't exist.
-- MySQL: t has the row, and u exists.
Fix direction
Foreign keys can only be disabled outside a transaction. Emulating the implicit commit for DDL would fix both problems: with no transaction open, the driver can disable foreign keys before the wrapper transaction begins and restore them after it ends, as the SQLite procedure intends. For DROP TABLE and TRUNCATE, the driver could reject a referenced parent table as MySQL does.
This changes transaction behavior, since DDL could no longer be rolled back, so I'd like your view on the approach first. I'm happy to contribute a PR in whichever direction you prefer.
Use of AI
This report was prepared with Claude Code.
- Langage dominant
- PHP
- Étoiles
- 362
- Forks
- 69
- Merge moyen
- 3 j 11 h
- PR mergées (30 j)
- 12
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Aucun guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de WordPress/sqlite-database-integration
-
MySQL-on-SQLite does not translate DATE arithmetic with INTERVAL HOURPeut-être pris @samuelmbabhazi l’a pris il y a 26 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
WordPress/sqlite-database-integration#454 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 40/100
WordPress/sqlite-database-integration#531 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
WordPress/sqlite-database-integration#529 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 1-2 jours Accessibilité débutants 52/100
WordPress/sqlite-database-integration#527 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
WordPress/sqlite-database-integration#526 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de WordPress/sqlite-database-integration
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
Featured image not passed to checks in the Tasks column or publish blocksPeut-être pris @roborourke l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
humanmade/publication-checklist#100 ·
Les mainteneurs répondent en général sous 1 jour
-
bug customer-reported
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
MagnaCapax/PMSS#1072 ·
Les mainteneurs répondent en général sous 5 jours
-
Difficulté 2/5 Une demi-journée Accessibilité débutants 68/100
components-web-app/docs#244 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
getgrav/grav-plugin-api#60 ·