Вставка в таблицу по порядку - PullRequest
4 голосов
/ 23 февраля 2012

Как вставить значения в таблицу (MySQL) следующим образом:
Во всех строках таблицы в порядке столбца идентификаторов (PK) вставьте инкрементный номер в столбец 'num'?
Например, если в таблице 3 строки, с идентификаторами 1,5,2, я хочу, чтобы идентификатор 1 получал num = 1, идентификатор 2 получал num = 2 и идентификатор 5 получал num = 3.

EDIT Я объясню, почему мне (кажется, мне) нужно это:
Я пытаюсь разбить столбец таблицы на отдельную таблицу с отношением 1: 1. Я думал, что получу все значения в порядке идентификатора и вставлю их в новую таблицу с автоматическим увеличением PK. тогда я знаю, что в порядке идентификатора значения для нового справочного столбца в исходной таблице будут автоматически увеличиваться числами. Поэтому я хочу вставить их в таком порядке. Я надеюсь, что это понятно.

Ответы [ 4 ]

4 голосов
/ 23 февраля 2012

В настоящее время я не работаю с ядром базы данных sql и поэтому не могу предоставить полностью проверенный код sql. однако, если ваше поле num не является полем автоинкремента, сделайте что-то вроде этого:

CREATE TEMPORARY TABLE temp_table_x (
    num int auto_increment primary key,
    reference_id int
);

INSERT temp_table_x (reference_id)
SELECT id FROM source_table ORDER BY id;

UPDATE source_table st 
    SET st.num = x.num
FROM temp_table_x x
WHERE reference_id = id;
3 голосов
/ 23 февраля 2012

Поскольку поле num является полем автоинкремента, оно должно быть простым:

INSERT INTO
  yourTable (
    field1,
    field2,
    field3,
    etc
  )
SELECT
  field1,
  field2,
  field3
FROM
  yourSourceTable
ORDER BY
  originalIdField
1 голос
/ 27 февраля 2012

Я бы НЕ сделал поле, которое ссылается на столбец в другой таблице, автоинкрементным столбцом.

Даже если столбец, на который он ссылается, является автоинкрементом, я не буду делать автоинкремент столбца. Будет трудно поддерживать синхронизацию столбцов. Если вставка откатывается в одну таблицу, но не в другую, вы не будете синхронизированы, пока не сбросите значение auto_increment.

Если это отношение 1 к 1, не стесняйтесь сделать столбец первичным ключом. Таким образом, он будет упорядочен по столбцу и обеспечит уникальные значения. Тем не менее, если любые два столбца должны совпадать, они не должны быть автоматически инкрементными, хотя они должны быть одного типа (например, INTEGER).

Например, вот наша исходная таблица, где первый столбец является целочисленным столбцом с автоинкрементом:

id  customer_name  email_address
---------------------------
1   jsmith         jsmith@aol.com
2   bwilliams      bwilliams@aol.com

Если вы хотите разделить email_address на свою собственную таблицу, в соотношении 1 к 1:

id  email_address
---------------------------
1   jsmith@aol.com
2   bwilliams@aol.com

Я бы сделал первый столбец целочисленным полем и сделал бы его первичным ключом, но он НЕ был бы столбцом с автоинкрементом.

Чтобы вставить значения в такую ​​таблицу, вы можете просто сделать это:

INSERT INTO table2
  (id, email_address)
SELECT id, email_address
  FROM table1
  ORDER BY id
0 голосов
/ 27 февраля 2012

Я нашел ответ.Это очень просто:

SET @c=0;
UPDATE myTable SET num = (@c:=@c+1) ORDER BY id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...