Skip to content

Instantly share code, notes, and snippets.

@JanVoracek
Created October 1, 2011 16:14
Show Gist options
  • Save JanVoracek/1256260 to your computer and use it in GitHub Desktop.
Save JanVoracek/1256260 to your computer and use it in GitHub Desktop.
MySQL WTF?
Dvě tabulky – tabulka 'a' obsahuje pouze primární klíč 'id', tabulka 'b' obsahuje dva cizí klíče 'a1' a 'a2' – oba odkazují na 'a.id' – s vlastnostní ON DELETE CASCADE
CREATE TABLE `a` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `b` (
`a1` int(11) NOT NULL,
`a2` int(11) NOT NULL,
KEY `a1` (`a1`),
KEY `a2` (`a2`),
CONSTRAINT `b_ibfk_2` FOREIGN KEY (`a2`) REFERENCES `a` (`id`) ON DELETE CASCADE,
CONSTRAINT `b_ibfk_1` FOREIGN KEY (`a1`) REFERENCES `a` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Naplníme je daty...
INSERT INTO `a` (`id`) VALUES (1), (2), (3), (4), (5);
INSERT INTO `b` (`a1`, `a2`) VALUES (1,1), (1,2), (1,3);
Tento select:
SELECT a2 FROM b WHERE a1 = 1;
Očekávaně vrátí: 1, 2, 3
Ale pokud ho použijeme jako vnořený v DELETE:
DELETE FROM a WHERE id IN (SELECT a2 FROM b WHERE a1 = 1);
Smaže se pouze jeden řádek – ten s id 1. Po jeho smazání zafunguje kaskádové smazání řádků z tabulky 'b' a záhadně se vytratí i z výsledku toho vnořeného selectu.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment