Sqlite3: как изменить порядок столбцов в таблице?
Кажется, что это не так просто для reordering columns
в sqlite3 table
, По крайней мере sqlite manager
в firefox
не поддерживает эту функцию. Например, переместите column2 в column3 и переместите column5 в column2. Есть ли способ изменить порядок столбцов в таблице sqlite, с помощью программного обеспечения для управления sqlite или сценария? Благодарю.
3 ответа
Это не тривиальная задача ни в одной СУБД. Вам почти наверняка придется создать новую таблицу с нужным вам порядком и переместить ваши данные из одной таблицы в порядок. Не существует оператора alter table для переупорядочения столбцов, поэтому ни в sqlite manager, ни в любом другом месте вы не найдете способа сделать это в той же таблице.
Если вы действительно хотите изменить порядок, вы можете сделать:
Предполагая, что у вас есть таблица A:
create table tableA(
col1 int,
col3 int,
col2 int);
Вы можете создать таблицу B со столбцами, отсортированными так, как вы хотите:
create table tableB(
col1 int,
col2 int,
col3 int);
Затем переместите данные в таблицу B из таблицы A:
insert into tableB
SELECT col1,col2,col3
FROM tableA;
Затем удалите исходную таблицу A и переименуйте таблицу B в TableA:
DROP table tableA;
ALTER TABLE tableB RENAME TO tableA;
Порядок в sqlite3 имеет значение. Концептуально, это не должно, но попробуйте этот эксперимент, чтобы доказать, что это делает:
CREATE TABLE SomeItems (identifier INTEGER PRIMARY KEY NOT NULL, filename TEXT NOT NULL, path TEXT NOT NULL, filesize INTEGER NOT NULL, thumbnail BLOB, pickedStatus INTEGER NOT NULL, deepScanStatus INTEGER NOT NULL, basicScanStatus INTEGER NOT NULL, frameQuanta INTEGER, tcFlag INTEGER, frameStart INTEGER, creationTime INTEGER);
Заполните таблицу примерно 20 000 записей, где миниатюра представляет собой небольшой JPEG-файл. Затем сделайте пару запросов, как это:
time sqlite3 Catalog.db 'select count(*) from SomeItems where filesize = 2;'
time sqlite3 Catalog.db 'select count(*) from SomeItems where basicscanstatus = 2;'
Не имеет значения, сколько записей возвращено, на моем компьютере первый запрос занимает около 0m0,008 с, а второй запрос занимает 0m0,942 с. Огромная разница, и причина кроется в Blob; Размер файла - до того, как Blob и basicscanstatus - после.
Теперь мы переместили Blob в его собственный стол, и наше приложение счастливое.
Вы всегда можете упорядочить столбцы так, как хотите в своем операторе SELECT, например так:
SELECT column1,column5,column2,column3,column4
FROM mytable
WHERE ...
Вам не нужно "заказывать" их в самой таблице.