Изменение типа столбца SQLite и добавление ограничения PK - PullRequest
13 голосов
/ 09 июня 2009

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

У меня есть:

    CREATE TABLE table(
        id INTEGER,
        salt TEXT NOT NULL UNIQUE,
        step INT,
        insert_date TIMESTAMP
    );

Я бы хотел изменить тип salt на TEXT, а тип идентификатора - INTEGER PRIMARY KEY.

Ответы [ 3 ]

27 голосов
/ 13 июля 2009

Ниже приведена выдержка из руководства по SQLite, в котором обсуждается команда ALTER TABLE (см. URL: Таблица изменения SQLite ):

SQLite поддерживает ограниченное подмножество ALTER TABLE. Команда ALTER TABLE в SQLite позволяет пользователю переименовать таблица или добавить новый столбец в существующая таблица. Не возможно переименовать столбец, удалить столбец или добавить или удалить ограничения из таблица.

Как указано в руководстве, невозможно изменить тип столбца или ограничения, такие как преобразование NULL в NOT NULL. Тем не менее, есть обходной путь

  1. копирование старой таблицы во временную таблицу,
  2. создание новой таблицы, определенной как желаемой, и
  3. копирование данных из временной таблицы в новую таблицу.

Чтобы отдать должное, когда это необходимо, я узнал об этом из дискуссии по проблеме № 1 проекта django-email-usernames hakanw на bitbucket.org.

CREATE TABLE test_table(
    id INTEGER,
    salt TEXT NOT NULL UNIQUE,
    step INT,
    insert_date TIMESTAMP
);

ALTER TABLE test_table RENAME TO test_table_temp;

CREATE TABLE test_table(
    id INTEGER PRIMARY KEY,
    salt TEXT,
    step INT,
    insert_date TIMESTAMP
);

INSERT INTO test_table SELECT * FROM test_table_temp;

DROP TABLE test_table_temp;

Примечания

  1. Я использовал имя таблицы test_table, поскольку SQLite выдаст ошибку, если вы попытаетесь назвать таблицу как table.
  2. Команда INSERT INTO не будет выполнена, если ваши данные не соответствуют ограничениям новой таблицы. Например, если исходный test_table содержит два поля id с одинаковым целым числом, вы получите «SQL error: PRIMARY KEY must be unique» при выполнении команды «INSERT INTO test_table SELECT * FROM test_table_temp;».
  3. Для всего тестирования я использовал SQLite версии 3.4.0, входящий в состав Python 2.6.2, на моем 13-дюймовом MacBook Unibody с Mac OS X 10.5.7.
1 голос
/ 09 июня 2009

Поскольку СУБД не указана, это запросы DB2:

  1. Сделать ID в качестве первичного ключа:

    ALTER TABLE table
        ADD CONSTRAINT pk_id
        PRIMARY KEY (id)
  2. Сделайте соль не УНИКАЛЬНОЙ:

    ALTER TABLE table
        DROP UNIQUE <salt-unique-constraint-name>
  3. Сделать соль обнуляемой:

    ALTER TABLE table
        ALTER COLUMN salt DROP NOT NULL

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

reorg table <tableName>
0 голосов
/ 09 июня 2009

В этом случае вы можете сделать соль до nullable и удалить уникальное ограничение. Кроме того, если столбец id не содержит нулевых или повторяющихся значений, вы можете безопасно сделать его первичным ключом с помощью SQL Server Studio Studio. ниже снимок экрана. надеюсь это прояснит альтернативный текст http://img265.imageshack.us/img265/7418/91573473.png

или используйте следующий sql:

alter table <TableName> modify salt text null
alter table <TableName> drop constraint <Unique Constraint Name>
alter table <TableName> modify id int not null
alter table <TableName> add constraint pk<Table>d primary key (id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...