Как изменить тип столбца в sqlite
Перейти к содержимому

Как изменить тип столбца в sqlite

  • автор:

ALTER TABLE оператор SQLite

В этом учебном пособии вы узнаете, как использовать SQLite оператор ALTER TABLE чтобы добавить столбец, изменить столбец, удалить столбец, переименовать столбец или переименовать таблицу (с синтаксисом и примерами).

Описание

В этом руководстве по SQLite объясняется, как использовать SQLite оператор ALTER TABLE для добавления столбца, изменения столбца, удаления столбца, переименования столбца или переименования таблицы (с синтаксисом и примерами).

Добавления столбца

Синтаксис

Синтаксис добавления столбца в таблицу в SQLite (используя ALTER TABLE):

ALTER TABLE table_name
ADD new_column_name column_definition;

table_name
Имя таблицы для изменения.

new_column_name
Имя нового столбца, добавляемого в таблицу.

column_definition
Тип данных и определение столбца (NULL или NOT NULL и т.д.).

Пример

Рассмотрим пример, который показывает, как добавить столбец в таблицу SQLite с помощью опертора ALTER TABLE.

ALTER TABLE employees
ADD status VARCHAR ;

Этот SQLite пример ALTER TABLE добавит столбец с именем status в таблицу employees . Он будет создан как столбец, который допускает значения NULL.

Изменить столбец в таблице

Вы не можете использовать оператор ALTER TABLE для изменения столбца в SQLite. Вместо этого вам нужно будет переименовать таблицу, создать новую таблицу и скопировать данные в новую таблицу.

Синтаксис

Синтаксис для изменения столбца в таблице в SQLite:

PRAGMA foreign_keys=off;

ALTER TABLE table1 RENAME TO _table1_old;

CREATE TABLE table1 (
( column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
.
);

INSERT INTO table1 (column1, column2, . column_n)
SELECT column1, column2, . column_n
FROM _table1_old;

Пример

Давайте рассмотрим пример, который показывает, как изменить столбец в таблице SQLite.

Например, если у нас была таблица employees , в которой был столбец с именем last_name , который был определен как тип данных CHAR:

CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
last_name CHAR NOT NULL ,
first_name VARCHAR ,
hire_date DATE

И мы хотели изменить тип данных поля last_name на VARCHAR, мы могли бы сделать следующее:

PRAGMA foreign_keys = off ;
BEGIN TRANSACTION ;
ALTER TABLE employees RENAME TO _employees_old;
CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
last_name VARCHAR NOT NULL ,
first_name VARCHAR ,
hire_date DATE
INSERT INTO employees (employee_id, last_name, first_name, hire_date)
SELECT employee_id,
first_name,
FROM _employees_old;
PRAGMA foreign_keys = on ;

Этот пример переименует нашу существующую таблицу employees в _employees_old . Затем он создаст новую таблицу employees с полем last_name , определенным как тип данных VARCHAR. Затем он вставит все данные из таблицы _employees_old в таблицу employees .

Удалить столбец из таблицы

Вы не можете использовать оператор ALTER TABLE для удаления столбца в таблице. Вместо этого вам нужно будет переименовать таблицу, создать новую таблицу и скопировать данные в новую таблицу.

Синтаксис

Синтаксис DROP A COLUMN в таблице в SQLite:

PRAGMA foreign_keys=off;

ALTER TABLE table1 RENAME TO _table1_old;

CREATE TABLE table1 (
( column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
.
);

INSERT INTO table1 (column1, column2, . column_n)
SELECT column1, column2, . column_n
FROM _table1_old;

Пример

Давайте рассмотрим пример, который показывает, как удалить столбец в таблице SQLite.

Например, если у нас была таблица employees , которая была определена следующим образом:

CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
last_name VARCHAR NOT NULL ,
first_name VARCHAR ,
hire_date DATE

И мы хотели удалить столбец с именем hire_date , мы могли бы сделать следующее:

PRAGMA foreign_keys = off ;
BEGIN TRANSACTION ;
ALTER TABLE employees RENAME TO _employees_old;
CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
last_name VARCHAR NOT NULL ,
first_name VARCHAR
INSERT INTO employees (employee_id, last_name, first_name)
SELECT employee_id,
first_name
FROM _employees_old;
PRAGMA foreign_keys = on ;

Этот пример переименует нашу существующую таблицу employees в _employees_old . Затем он создаст новую таблицу employees с удаленным полем hire_date . Затем он вставит все данные (исключая поле hire_date ) из таблицы _employees_old в таблицу employees .

Переименовать столбец в таблице

Вы не можете использовать оператор ALTER TABLE для переименования столбца в SQLite. Вместо этого вам нужно будет переименовать таблицу, создать новую таблицу и скопировать данные в новую таблицу.

Синтаксис

Синтаксис RENAME A COLUMN в таблице в SQLite:

PRAGMA foreign_keys=off;

ALTER TABLE table1 RENAME TO _table1_old;

CREATE TABLE table1 (
( column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
.
);

INSERT INTO table1 (column1, column2, . column_n)
SELECT column1, column2, . column_n
FROM _table1_old;

Пример

Давайте рассмотрим пример, который показывает, как переименовать столбец в таблице SQLite.

Например, если у нас была таблица employees , которая была определена следующим образом:

Изменить тип столбца в sqlite3

Я новичок в SQLite 3, и теперь мне пришлось добавить столбец в существующую таблицу. Я продолжал это делать: ALTER TABLE thetable ADD COLUMN category; . Конечно, я забыл указать этот тип столбца. Первое, о чем я думал, — это удалить этот столбец, а затем снова добавить его. Однако, похоже, что SQLite не имеет простого способа сделать это, и мне пришлось бы делать резервную копию таблицы и воссоздавать ее без столбца. Это кажется беспорядочным, и мне было интересно, есть ли способ изменить/добавить тип столбца. Я бы так подумал, но мой поиск не дал никаких результатов, будучи новым для SQLite, я предполагаю, что это связано с тем, что моя формулировка отключена в запросе.

Jorge Israel Peña 18 янв. 2010, в 03:58
Поделиться

Возможно, полезно для других, задающихся вопросом, как избежать этого в первую очередь . Укажите характеристики столбца после имени столбца. Пример: ALTER TABLE thetable ADD COLUMN thenewcolumn INTEGER DEFAULT 0 .

dat 10 окт. 2018, в 17:42
Поделиться:
alter-table

4 ответа

Лучший ответ

SQLite не поддерживает удаление или изменение столбцов, очевидно. Но помните, что типы данных столбцов не являются жесткими в SQLite.

Roger Pate 18 янв. 2010, в 02:24
Поделиться

Так что, если я не определил тип, я все еще смогу вставить в него текст? Конечно, позже, когда я развернусь в производство, я явно укажу тип (текст), но сейчас со мной все будет в порядке?

Jorge Israel Peña 18 янв. 2010, в 02:31

Да. В этот столбец также можно вставить нетекстовые значения: «SQLite использует более общую систему динамических типов. В SQLite тип данных значения связан с самим значением, а не с его контейнером». (из моей второй ссылки) Указание типов столбцов в SQLite имеет гораздо меньшее значение, чем в других RDBM.

Roger Pate 18 янв. 2010, в 02:39

Это правда . но если вы позже создадите другие таблицы с типом данных, который вы использовали бы, тогда ваши запросы на соединение не смогут использовать индексы, потому что столбцы не будут иметь тот же тип

DallinDyer 12 март 2013, в 17:56

Отсутствие типа в столбце также вызовет проблемы с предложениями where. Например, если вы объявляете столбец _id без типа, предложение where, которое использует заполнитель (например, where _id=? ), Никогда не будет возвращать никаких строк, поскольку в конечном запросе будет использоваться where _id=’1′ а SQLite не будет знать, как сделать сравнение правильно. Он будет сравнивать два как строку (из предложения where) и целое число (из данных строки), и каждый раз будет ложным. Пропуск типа столбца кажется большим упущением, а SQLite — еще большим упущением.

spaaarky21 07 июль 2014, в 16:55
Итак, если вы определяете тип столбца как INT тогда вы можете вставить в него значения VARCHAR ?
Pierre 03 апр. 2015, в 18:38
Показать ещё 3 комментария

Для тех, кто ищет и находит эту страницу в этом году 2017 года: Если вы новичок в SQLite и/или предпочитаете графический интерфейс, sqlitebrowser сделает это несколькими щелчками мыши.

  • «Файл» — «Открыть базу данных»
  • На вкладке «Структура базы данных» щелкните содержимое таблицы (не имя таблицы), затем «Изменить», «Изменить таблицу», и теперь вы можете изменить тип данных любого столбца с помощью выпадающего меню. Я изменил поле «текст» на «числовое», чтобы получить данные в диапазоне номеров.

Программа sqlitebrowser (DB Browser для SQLite) является открытым исходным кодом и бесплатна. Для Linux он доступен из репозитория. Надеюсь, это поможет кому-то!

Insilico 07 март 2017, в 21:42
Поделиться

Что вы подразумеваете под « кликом по содержимому таблицы (не по названию таблицы) »? На вкладке «Структура базы данных» мне пришлось нажать на имя таблицы в разделе Таблицы -> Mytable. Я также смог щелкнуть правой кнопкой мыши имя таблицы, чтобы открыть всплывающее меню, где вы можете выбрать «Изменить таблицу».

stackoverflowuser2010 03 июль 2017, в 16:25

создайте резервную копию базы данных, прежде чем пытаться вносить какие-либо изменения в таблицу браузера БД в существующей базе данных sqlite: github.com/sqlitebrowser/sqlitebrowser/issues/1481

Demian 20 сен. 2018, в 17:02

Это возможно, воссоздавая таблицу. Для меня это работает следующим образом:

  • создать временную таблицу, используя как выбор * из вашей таблицы
  • отбросьте таблицу, соберите свою таблицу, используя тип столбца изменения.
  • теперь вставлять записи из таблицы temp в вашу вновь созданную таблицу
  • удалить временную таблицу

сделать все выше шаги в рабочем потоке, чтобы уменьшить нагрузку на uithread

RD-07 30 май 2016, в 09:11
Поделиться

#!/bin/bash DB=/tmp/synapse/homeserver.db TABLE="public_room_list_stream" FIELD=visibility OLD="BOOLEAN NOT NULL" NEW="INTEGER NOT NULL" TMP=/tmp/sqlite_$TABLE.sql echo "### create dump" echo ".dump '$TABLE'" | sqlite3 "$DB" >$TMP echo "### editing the create statement" sed -i "s|$FIELD $OLD|$FIELD $NEW|g" $TMP read -rsp $'Press any key to continue deleting and recreating the table $TABLE . \n' -n1 key echo "### rename the original to '$TABLE"_backup"'" sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'" echo "### delete the old indexes" for idx in $(echo "SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name LIKE '$TABLE""%';" | sqlite3 $DB); do echo "DROP INDEX '$idx';" | sqlite3 $DB done echo "### reinserting the edited table" cat $TMP | sqlite3 $DB 

rubo77 10 янв. 2017, в 21:48
Поделиться

Ещё вопросы

  • 1 Диалоговое окно оповещения в Android
  • 1 Нужна помощь, создав диалог с 2 NumberPickers
  • 0 Как рассчитать итоговую сумму в MySQL без группы по предложению в MySQL
  • 0 Раскрывающееся меню HTML удаляет пробелы между элементами LI
  • 0 Создать виджет из другого в качестве прототипа
  • 1 Каков наилучший способ аутентификации двух типов пользователей (ученик и водитель) в моем приложении для Android с использованием Firebase
  • 1 Как поделиться кодом котлина в IntelliJ IDEA между рабочим столом, android и сервером?
  • 0 Столбец запроса для нескольких значений
  • 0 Как получить список предметов из одной таблицы и общее количество связанных с ними предметов из пыльника в mySql?
  • 1 Как получить GAL из Outlook в Интернете
  • 1 node.js печатает пользовательский объект перечисления с дополнительным полем [Number], например
  • 0 Плагин jQuery Mask со знаком%
  • 1 Установка нового сервера Glassfish на Eclipse Indigo
  • 0 Как найти количество тегов Div в HTML-файл в IOS?
  • 1 Как работает конвейер Camel с конечной точкой jms
  • 1 Как привязать порт в Java-классе
  • 0 JS не работает в FireFox, но работает в Chrome & IE
  • 0 Регулярное выражение для соответствия шаблону как 2: 1 в угловых js
  • 1 По какой причине конструкторы классов ES6 нельзя назвать обычными функциями?
  • 0 Ошибка: ожидаемый идентификатор
  • 0 CSS не переносится на новое содержимое вкладки
  • 0 Не могу понять, почему это не работает
  • 1 Темные значки в строке состояния при открытом диалоге
  • 1 Преобразование структуры локальной папки в структуру папки на сервере
  • 0 типинезависимый объект класса шаблона
  • 1 Как обеспечить входные данные времени выполнения в тестовых случаях Python
  • 0 LinkedStack и его шаблонный класс
  • 1 Infragistics Ultragrid — низкая производительность с помощью PerformAutoResize
  • 0 3 зависимых поля выбора
  • 0 Поместите условие для ng-submit в несколько строк
  • 1 Flask sqlAlchemy: создание моделей для существующей структуры базы данных
  • 1 «Org.json.JSONException: запрещенное числовое значение: NaN»
  • 1 Как я могу исправить нераспознанную проблему класса?
  • 1 Установка httpVersion с помощью httpClientBuilder
  • 1 Получить базу данных Fire в реальном времени, используя условие where
  • 1 Python GUI, который поддерживает интерфейс как CSS & HTML?
  • 0 Как скрыть строку подключения MySQL — имя пользователя и пароль на GitHub (Java)
  • 1 Сбой сборки Oreo 8.1 boringssl для принудительного режима FIPS
  • 0 анимация на виде позвоночника
  • 1 Ошибка говорит «настроить на использование jdk», хотя eclipse использует свой собственный компилятор. Что может быть причиной этого?
  • 0 если утверждение продолжает отступать к остальной части
  • 0 всплывающее окно больше не блокируется
  • 1 Как установить TCP-соединение и отправить данные в Android Virtual Device App
  • 1 Удалить пробелы из первого и последнего символа в заголовках нескольких размеров
  • 1 Преобразование даты в Java-приложении
  • 1 Как можно создать / удалить файлы в / data / data dir с помощью root в Android?
  • 0 Проблемы с загрузкой формы PHP
  • 0 отображать высоту div в соответствии с высотой другого div
  • 1 Guice — Ограничения полевых инъекций
  • 0 сделать два слайд-шоу HTML

Изменить тип данных столбца в SQLite

Всем доброго времени суток.
В процессе отображения данных из выборки необходимо значения столбца привести к «кило», «мега» и «гига» значениям, т.е. отбросить нули и поработать с плавающей точкой. Алгоритм написан и работает если тип данных столбца не определять совсем или определить типом данных STRING. Значения столбца забиндены (Live Binding) напрямую на Label.
Задача сделать выборку (поиск) из таблицы SQLite. Запрос типа

'select * from Table where (F1 between 400000 and 3999999) or (F2 between 400000 and 4000000)'

Работает он с типом INTEGER.
Если тип данных столбца установить INTEGER, то ошибка не возникает, но некоторые значения меняются в отображении Label. Например значение «2200000000» становиться «-2094967296».

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Как для созданной таблицы изменить тип столбца
Где можно изменить тип данных таблицы в IBConsole

Изменить тип у столбца в SqLite
Как можно через метод: @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int.

Изменить тип данных столбца, являющегося идентификатором
Здравствуйте! Помогите, пожалуйста, разрулить вот какую проблему: Есть таблица Table, наполненная.

5287 / 4229 / 1044
Регистрация: 29.08.2013
Сообщений: 26,660
Записей в блоге: 3

ЦитатаСообщение от CaptainLGA Посмотреть сообщение

INTEGER, то ошибка не возникает, но некоторые значения меняются в отображении Label. Например значение «2200000000» становиться «-2094967296».

почитайте про размер integer
2200000000 немного великовато для него
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
А тип Int64 там использовать можно?
5287 / 4229 / 1044
Регистрация: 29.08.2013
Сообщений: 26,660
Записей в блоге: 3
Вроде есть bigint
Надо смотреть в хелпе, я думаю ТС сам и посмотрит
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
Нет ни того, на другого, по крайней мере в версии 3

Каждое значение, хранящееся в базе данных SQLite (или обрабатываемое движком), имеет один из следующих классов хранения:

NULL. Пустое значение в таблице базы.
INTEGER. Целочисленное значение, хранящееся в 1, 2, 3, 4, 6 или 8 байтах, в зависимости от величины самого значения.
REAL. Числовое значение с плавающей точкой. Хранится в формате 8-байтного числа IEEE с плавающей точкой.
TEXT. Значение строки текста. Хранится с использованием кодировки базы данных (UTF-8, UTF-16BE или UTF-16LE).
BLOB. Значение бинарных данных, хранящихся точно в том же виде, в каком были введены.

Регистрация: 01.03.2018
Сообщений: 4

ЦитатаСообщение от qwertehok Посмотреть сообщение

Вроде есть bigint
Надо смотреть в хелпе, я думаю ТС сам и посмотрит

Да, есть BIGINT. Но это не понадобилось.
Ошибка найдена.
В общем не нужно задавать принудительно в SQLite тип данных. Он там динамический. То есть можно работать как со строковыми функциями так и с численными.
Выборка была отнесена к ошибочным из-за непопадания части данных. Но проблема не в типах данных, а в неправильном запросе. Дело в том что в выборку не попали значения с F1 меньше заданного диапазона и F2 больше заданного для нее диапазона как и было указано в общем то. А в эталонной выборке с которой сравнивал они были. В общем переделал запрос и все ок.

Изменить тип у столбца в SqLite

Изменить тип данных столбца в SQLite
Всем доброго времени суток. В процессе отображения данных из выборки необходимо значения столбца.

Изменить тип столбца
Добрый день, помогите, пожалуйста. Есть таблица district, в ней есть столбец nameD типа.

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

Изменить тип столбца на автозаполняющийся
Есть таблица с уже кучей записей (почти 3млн). Поле ID сейчас просто Biging. Как сделать его.

325 / 123 / 10
Регистрация: 01.11.2012
Сообщений: 586

копируешь во временную таблицу, удаляешь столбец, создаешь новый с новым типом, вставляешь данные

Добавлено через 52 секунды
По крайней мере MS SQL Enterprise так делает. Тут думаю так же.

Регистрация: 20.04.2013
Сообщений: 666

ЦитатаСообщение от dubok79 Посмотреть сообщение

копируешь во временную таблицу, удаляешь столбец, создаешь новый с новым типом, вставляешь данные

По крайней мере MS SQL Enterprise так делает. Тут думаю так же.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *