2017-02-01 18 views
0

Я хочу вставить данные в таблицу в определенном порядке. Это связано с тем, что я должен предоставить каждой записи определенный идентификатор. То, что я использую, является отборным заявлением:MySQL: insert select in order

select (@i := @i + 1) as id, ... 
order by column 

Проблема, с которой я сталкиваюсь, заключается в том, что это не работает. Я получаю результат, который я хочу получить из запроса select. Однако, когда я пытаюсь вставить данные в таблицу, порядок по инструкции игнорируется. Есть ли способ заставить правильный порядок в инструкции insert?

То, что я хочу это:

+----+------+-------------+ 
| id | name | breadcrumbs | 
+----+------+-------------+ 
| 1 | test | 01   | 
| 5 | -d | 01,05  | 
| 4 | c | 04   | 
| 6 | e | 06   | 
| 2 | -a | 06,02  | 
| 3 | --b | 06,02,03 | 
+----+------+-------------+ 

Чтобы стать этим:

+----+------+-------------+ 
| id | name | breadcrumbs | 
+----+------+-------------+ 
| 1 | test | 01   | 
| 2 | -d | 01,05  | 
| 3 | c | 04   | 
| 4 | e | 06   | 
| 5 | -a | 06,02  | 
| 6 | --b | 06,02,03 | 
+----+------+-------------+ 

В отдельной временной таблицы.

+0

Вы хотите генерировать идентификаторы, основанные на сортировку сухари на родитель, ребенок, внучата основу - к примеру 01 первыми следует 01, 02, за которым следует 01,02,03, за которым следует 01,03, затем 02, затем 02,01 и т. Д.? –

ответ

0

Я хочу вставить данные в таблицу в определенном порядке.

Внутренний порядок записей в таблице базы данных MySQL отсутствует. Таблицы моделируются после неупорядоченных множеств. Единственный существующий порядок - это тот, который вы применяете, используя предложение ORDER BY при запросе. Поэтому, двигаясь вперед, вместо того, чтобы беспокоиться о порядке, в котором вставлены ваши записи, вы должны убедиться, что в таблице есть необходимые столбцы и данные, чтобы упорядочить ваши результаты так, как вы хотите.

1

Я бы убедиться в том, что @i является initalised см выберите в из пункта ниже

MariaDB [sandbox]> drop table if exists t; 
Query OK, 0 rows affected (0.14 sec) 

MariaDB [sandbox]> 
MariaDB [sandbox]> create table t(id int, name varchar(10), breadcrumbs varchar(100)); 
Query OK, 0 rows affected (0.18 sec) 

MariaDB [sandbox]> insert into t values 
    -> ( 1 , 'test' , '01'  ), 
    -> ( 5 , '-d' , '01,05' ), 
    -> ( 4 , 'c' , '04'  ), 
    -> ( 6 , 'e' , '06'  ), 
    -> ( 2 , '-a' , '06,02' ), 
    -> ( 3 , '--b' , '06,02,03'); 
Query OK, 6 rows affected (0.01 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

MariaDB [sandbox]> 
MariaDB [sandbox]> drop table if exists t1; 
Query OK, 0 rows affected (0.13 sec) 

MariaDB [sandbox]> create table t1 as 
    -> select 
    -> @i:[email protected]+1 id, 
    -> t.name,t.breadcrumbs 
    -> from (select @i:=0) i, 
    -> t 
    -> order by breadcrumbs; 
Query OK, 6 rows affected (0.22 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

MariaDB [sandbox]> 
MariaDB [sandbox]> select * from t1; 
+------+------+-------------+ 
| id | name | breadcrumbs | 
+------+------+-------------+ 
| 1 | test | 01   | 
| 2 | -d | 01,05  | 
| 3 | c | 04   | 
| 4 | e | 06   | 
| 5 | -a | 06,02  | 
| 6 | --b | 06,02,03 | 
+------+------+-------------+ 
6 rows in set (0.00 sec) 
+0

Замена вставки с помощью create table, как и трюк. – user110971