Можно ли вставить данные в средний раздел таблицы с помощью команды INSERT? - PullRequest
3 голосов
/ 08 ноября 2010

Пример:

INDEX |SOME_DATA

1 |some_data1

3 |some_data3

4 |some_data4

5 |some_data5

Я хочу сделать INSERT, чтобы добавить ---> 2 |some_data2.Есть команда SQL или какой-то способ сделать это?

[править]
ОК.Может быть, если я объясню все, чего я хочу достичь, вы поймете, почему я пытаюсь делать то, что хочу.Я создал страницу веб-администратора в php, которая просто отображает данные из таблицы базы данных. Теперь эти отображаемые строки «перетаскиваемы».Например, вы можете перетащить строку № 2, чтобы сказать, строка № 4.Теперь о событии mouseup. Я хочу сохранить новый порядок в базе данных.

1 |data1 -------------------------> 1 |данные1
2 |data2 ------- После перетаскивания -----> 3 |данные3
3 |data3 -------------------------> 4 |данные4
4 |data4 -------------------------> 2 |data2
Видишь мою проблему?я не могу просто обновить значение в столбце INDEX для одного значения, которое было перетащено.Мне придется обновить все значения, которые были перенесены.3 должно стать 2, 4, 3 и 2 должно стать новым 4. Это слишком много обновлений sql (особенно если таблица больше).Поэтому я хочу удалить строку №2 и вставить ее в правильное место.

Ответы [ 4 ]

6 голосов
/ 08 ноября 2010

Просто вставьте данные;Таблицы не имеют принципиального порядка.Единственное упорядочение результатов таблицы происходит, когда вы сами определяете его в своем операторе выбора.

Редактировать: если вы хотите, чтобы у вас было отдельное упорядочение, вам было бы хорошо иметь отдельный столбец «порядок».Я бы порекомендовал сделать его типа float, чтобы вы могли вставлять записи в любое место между другими записями, не требуя обновления.Например, если у вас есть запись «A» со значением столбца «order» «1», запись «B» со значением столбца «order» «2», и вы хотите вставить запись «C», чтобы она отображалась между записями »A "и запись" B ", просто вставьте его со значением столбца" order ", установленным на 1,5 (1 + 2 / 2.0).Таким образом, вы можете выполнить выбор с помощью «order by» в столбце «order», и все должно получиться так, как вы хотите.Поплавки являются достаточно хорошим решением этой проблемы, так как места достаточно для поддержки большого количества промежуточных добавлений.

5 голосов
/ 08 ноября 2010

Вы должны просто добавить его как обычный:

INSERT INTO some_table (index, some_data) VALUES (2, 'some_data2')

После вставки, если вы действительно хотите упорядочить строки по индексу, запустите:

ALTER TABLE some_table ORDER BY index;

В общем, порядок действительно не важен. Вы должны использовать индексы для столбцов, по которым вы находите, и ORDER BY при получении наборов результатов. Для оптимизации или сортировки не следует полагаться на порядок вставки строк в таблицу.

2 голосов
/ 08 ноября 2010

Да, вы можете указать первичный ключ строки при вставке.

insert into yourtablename (index, some_data) values (2, "some_data2");

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

1 голос
/ 09 ноября 2010

Хорошо, я отвечаю снова, потому что ваше обновление показывает, что вы задаете совершенно другой вопрос, чем все думали, что вы.

Метод, который вы описали - обновить индекс перемещенной строки и каждого списка в списке после нее - совершенно правильный метод.

Почему вы говорите, что "это слишком много обновлений sql"? Пока к столбцу index применен индекс MySQL , эти обновления будут быстро светиться, даже для очень больших списков (они будут порядка миллисекунд).

Я думаю, вы либо предварительно оптимизируете, либо у вас нет определенного индекса. Чтобы добавить индекс (если у вас его еще нет), выполните следующую команду:

CREATE INDEX row_index_index ON `some_table` (`index`);

Вы также можете пересмотреть переименование столбца «index» во что-то вроде «position», чтобы избежать путаницы в номенклатуре с фактическим индексом MySQL.

...