Ne, jedním příkazem MySQL nemůžete vkládat do více tabulek. Můžete však použít transakce.
BEGIN;
INSERT INTO users (username, password)
VALUES('test', 'test');
INSERT INTO profiles (userid, bio, homepage)
VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com');
COMMIT;
Podívejte se na LAST_INSERT_ID()
znovu použít hodnoty automatického zvýšení.
Řekl jste "Po tak dlouhé době, kdy jsem se na to snažil přijít, to stále nefunguje. Nemůžu jednoduše vložit právě vygenerované ID do $var a vložit $var do všech příkazů MySQL? "
."Dovolte mi to upřesnit:zde jsou 3 možné způsoby:
-
V kódu, který vidíte výše. To vše v MySQL a
LAST_INSERT_ID()
v druhém příkazu bude automaticky hodnota sloupce automatického přírůstku, který byl vložen do prvního příkazu.Bohužel, když druhý příkaz sám vloží řádky do tabulky se sloupcem s automatickým přírůstkem,
LAST_INSERT_ID()
bude aktualizována na tabulku 2, nikoli na tabulku 1. Pokud budete i poté stále potřebovat tabulku 1, budeme ji muset uložit do proměnné. To nás vede ke způsobům 2 a 3: -
Bude skladovat
LAST_INSERT_ID()
v proměnné MySQL:INSERT ... SELECT LAST_INSERT_ID() INTO @mysql_variable_here; INSERT INTO table2 (@mysql_variable_here, ...); INSERT INTO table3 (@mysql_variable_here, ...);
-
Bude skladovat
LAST_INSERT_ID()
v proměnné aphp (nebo v jakémkoli jazyce, který se může připojit k databázi, dle vašeho výběru):INSERT ...
- K získání
LAST_INSERT_ID()
použijte svůj jazyk , buď provedením tohoto doslovného příkazu v MySQL, nebo například pomocí phpmysql_insert_id()
který to udělá za vás INSERT [use your php variable here]
UPOZORNĚNÍ
Ať už zvolíte jakýkoli způsob řešení, musíte se rozhodnout, co by se mělo stát pokud by bylo provádění mezi dotazy přerušeno (například dojde k selhání vašeho databázového serveru). Pokud dokážete žít s „někteří skončili, jiní ne“, nečtěte dál.
Pokud se však rozhodnete "buď všechny dotazy skončí, nebo žádný - nechci řádky v některých tabulkách, ale žádné odpovídající řádky v jiných, vždy chci, aby moje databázové tabulky byly konzistentní", musíte všechny příkazy zabalit do transakce . Proto jsem použil BEGIN
a COMMIT
zde.