Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Вмъкване в множество таблици? (Нормализация на базата данни?)

Не, не можете да вмъкнете в няколко таблици в една MySQL команда. Можете обаче да използвате транзакции.

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;

Разгледайте LAST_INSERT_ID() за повторно използване на стойности за автоматично увеличение.

Казахте „След цялото това време, опитвайки се да го разбера, пак не работи. Не мога ли просто да сложа току-що генерирания идентификатор в $var и да сложа този $var във всички команди на MySQL? "

Позволете ми да уточня:тук има 3 възможни начина:

  1. В кода, който виждате по-горе. Това прави всичко в MySQL и LAST_INSERT_ID() във втория израз автоматично ще бъде стойността на колоната за автоматично увеличение, която е била вмъкната в първия израз.

    За съжаление, когато самият втори израз вмъква редове в таблица с колона с автоматично увеличение, LAST_INSERT_ID() ще бъде актуализиран до тази на таблица 2, а не на таблица 1. Ако все още имате нужда от тази от таблица 1 след това, ще трябва да я съхраним в променлива. Това ни води до начини 2 и 3:

  2. Ще съхранява LAST_INSERT_ID() ina MySQL променлива:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. Ще съхранява LAST_INSERT_ID() в aphp променлива (или всеки език, който може да се свърже с база данни, по ваш избор):

    • INSERT ...
    • Използвайте езика си, за да извлечете LAST_INSERT_ID() , или чрез изпълнение на този литерал в MySQL, или като използвате например mysql_insert_id() на php което прави това за вас
    • INSERT [използвайте вашата php променлива тук]

ПРЕДУПРЕЖДЕНИЕ

Какъвто и начин за решаване на това да изберете, трябва да решите какво да се случи ако изпълнението бъде прекъснато между заявките (например вашият сървър на база данни се срива). Ако можете да живеете с „някои са свършили, други не“, не четете.

Ако обаче решите „или всички заявки завършват, или нито една не завършва – не искам редове в някои таблици, но няма съвпадащи редове в други, винаги искам таблиците ми в базата данни да бъдат последователни“, трябва да обвиете всички изрази в транзакция . Ето защо използвах BEGIN и COMMIT тук.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция MySQL ACOS() – Връща косинус на дъгата на число

  2. Производителност на пакетно вмъкване на JDBC

  3. Най-добрият начин да тествате дали в MySQL таблица съществува ред

  4. GROUP_CONCAT() Функция в MySQL

  5. Пребройте броя на появяванията на низ в поле VARCHAR?