Изменение типа столбца SQLite и добавление ограничения PK

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

У меня есть:

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

Я хотел бы изменить тип salt только на TEXT и тип id на INTEGER PRIMARY KEY.

Ответы

Ответ 1

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

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

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

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

Чтобы дать кредит, когда кредит должен быть получен, я узнал об этом из обсуждения № 1 проекта hakanw django-email-usernames на 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;

Примечания

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

Ответ 2

Поскольку RDBMS не указывается, это DB2-запросы:

  • Сделать идентификатор в качестве первичного ключа:

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

    ALTER TABLE table
        DROP UNIQUE <salt-unique-constraint-name>
  • Сделать соль нулевой:

    ALTER TABLE table
        ALTER COLUMN salt DROP NOT NULL

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

reorg table <tableName>

Ответ 3

В этом случае вы можете сделать соль равным нулю и удалить уникальное ограничение. Кроме того, если столбец id не содержит нулевых или повторяющихся значений, вы можете безопасно сделать его первичным ключом, используя студию управления сервером sql. ниже показан снимок экрана. надеюсь, что это станет понятным: alt text 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)