sql >> Databasteknik >  >> RDS >> Mysql

MySQL Infoga i Select

Ibland kan du behöva infoga många värden från en tabell till en annan tabell i MySQL. Det kan vara tråkigt att manuellt ange dessa värden i din INSERT sql-sats. Så här använder du enkelt SELECT-satsen för att infoga värden i tabellen med MySQL INSERT INTO SELECT-frågan. Du kan använda den för att snabbt fylla i MySQL-tabeller.

MySQL Infoga i Select

Här är stegen för att infoga värden i MySQL-tabeller med hjälp av INSERT INTO SELECT-satsen. Anta att du har följande tabell new_orders(id, order_date, amount)

mysql> create table new_orders(id int, order_date date, amount int);

Här är syntaxen för MySQL INSERT INTO SELECT-satsen.

INSERT INTO table_name(column_list)
SELECT 
   select_list 
FROM 
   another_table
WHERE
   condition;

I ovanstående fråga använder vi en SELECT-sats istället för VALUES-satsen. Det är mycket användbart att snabbt kopiera en eller flera rader från en annan tabell, eller till och med sammanfattande data från en annan tabell.

Bonusläsning:MySQL Välj Top N Rows

Låt oss titta på några exempel för MySQL INSERT INTO SELECT.

MySQL INFOGA I VALDA FLERA RADER

Här är SQL-frågan för att infoga flera rader i en tabell med INSERT INTO SELECT-satsen.

mysql> insert into new_orders
       select id, order_date, item_price
       from orders;

mysql> select * from new_orders;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-01 |    150 |
|    2 | 2020-07-01 |    235 |
+------+------------+--------+

Du kan utelämna kolumnnamnen efter INSERT-satsen om kolumnnamnen i SELECT-satsen är identiska med dem i din tabell.

Bonusläsning:MySQL Ta bort dubbletter av poster

MySQL INFOGA I VÄLJ FRÅN SAMMA TABELL

Här är SQL-frågan för att infoga rader från samma tabell med INSERT INTO SELECT-satsen.

mysql> insert into new_orders
       select *
       from new_orders;

mysql> select * from new_orders;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-01 |    150 |
|    2 | 2020-07-01 |    235 |
|    1 | 2020-07-01 |    150 |
|    2 | 2020-07-01 |    235 |
+------+------------+--------+

I ovanstående fråga använder vi MySQL INSERT INTO SELECT för alla kolumner i en tabell.

Bonus Läs:Hur man kör lagrad procedur

MySQL INSERT INTO SELECT från en annan databas

Här är SQL-frågan för att infoga rader från en annan databas dashboard . Den enda skillnaden är att lägga databasnamnet till ditt tabellnamn i SELECT-frågan.

mysql> insert into users (user_id,date_joined)
select id,date_joined
from dashboard.auth_user;

I ovanstående fråga har vi använt dashboard.auth_user istället för bara auth_user för att ange att den här tabellen finns i en annan databas.

Bonus Läs:MySQL Få dubbletter av poster

MySQL INSERT INTO SELECT vid dubblettuppdatering

Om du infogar dubbletter av primärnyckel eller indexvärden i en tabell kommer MySQL att ge ett fel. I INSERT INTO SELECT-satsen kan du också instruera MySQL att uppdatera specifika kolumner i händelse av dubbletter av värden, med hjälp av ON DUPLICATE KEY UPDATE-satsen. Här är ett exempel på MySQL INSERT INTO SELECT vid dubblettuppdatering.

Låt oss säga att du har följande tabell x_orders(id, summa)

mysql> create table x_orders(id int auto_increment primary key, amount int);

Låt oss säga att du har new_orders-tabellen som har dubbletter av värden för id-kolumnen.

mysql> select * from new_orders;
+------+------------+--------+
| id   | order_date | amount |
+------+------------+--------+
|    1 | 2020-07-01 |    150 |
|    2 | 2020-07-01 |    235 |
|    1 | 2020-07-01 |    150 |
|    2 | 2020-07-01 |    235 |
+------+------------+--------+

Låt oss säga att du försöker infoga värden från tabellen new_orders i x_orders. Du kommer att få ett felmeddelande som visas.

mysql> insert into x_orders(id,amount)
       select id, amount
       from new_orders;
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Här är SQL-satsen att använda ON DUPLICATE KEY UPDATE-satsen.

mysql> insert into x_orders(id,amount)
       select id, amount
       from new_orders
       on duplicate key update id = RAND() * 100;

mysql> select * from x_orders;
+----+--------+
| id | amount |
+----+--------+
| 27 |    235 |
| 48 |    150 |
| 58 |    235 |
| 62 |    150 |
+----+--------+

Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!

  1. 2 sätt att se om föråldrade funktioner fortfarande används i en SQL Server-instans

  2. Fix Åtkomst nekad för användaren 'root'@'localhost' för phpMyAdmin

  3. Introduktion till PL/SQL Bulk Collect i Oracle Database

  4. Förstå ProxySQL-granskningsloggen