2009-06-09 2 views
13

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

У меня есть:

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

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

+0

Вам нужно больше информации, включая другие индексы, Ограничения, PK ... Если вы используете MSSQL, то, пожалуйста, сделайте «Script table as ...» -> «Создать в» -> «Новое окно запроса» и вставьте этот скрипт здесь. Тогда кто-то поможет вам создайте сценарии ALTER для изменения. – van

ответ

0

В этом случае вы можете сделать соль до nullable и удалить уникальное ограничение. Также если 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) 
+0

Да, но я думаю, что он хочет знать, КАК. :) –

+3

этот вопрос касается sqlite, а не о sql-сервере, приведенный выше синтаксис 'alter table' не поддерживается SQLite, к сожалению. – Abel

1

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

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

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

    ALTER TABLE table 
        DROP UNIQUE <salt-unique-constraint-name>
  3. Сделать соль Nullable:

    ALTER TABLE table 
        ALTER COLUMN salt DROP NOT NULL

Вам нужно будет сделать REORG после падения не нулевой. Это нужно сделать из командной строки.

reorg table <tableName> 
+2

My ответ был опубликован до того, как вопрос был изменен для указания используемой базы данных. –

27

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

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

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

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

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

Примечание

  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" Unibody MacBook с Mac OS X 10.5.7.
+2

Что произойдет, если есть индекс, ссылающийся на отложенную таблицу? Его нужно воссоздать, верно? – mafu