#sqlite #constraints
#sqlite #ограничения
Вопрос:
Прежде чем изменять таблицу, я хочу сделать ее резервную копию, поэтому я использую этот код :
CREATE TABLE states_BACKUP (
state_id INTEGER NOT NULL,
domain VARCHAR(64),
entity_id VARCHAR(255),
state VARCHAR(255),
attributes TEXT,
event_id INTEGER,
last_changed DATETIME,
last_updated DATETIME,
created DATETIME,
context_id VARCHAR(36),
context_user_id VARCHAR(36), old_state_id INTEGER,
PRIMARY KEY (state_id),
FOREIGN KEY(event_id) REFERENCES events (event_id)
);
INSERT into states_BACKUP
Select *
FROM STATES;
Однако при выполнении части вставки сообщение об ошибке гласит :
Выполнение завершено с ошибками.
Результат: сбой УНИКАЛЬНОГО ограничения: states_BACKUP.state_id
В строке 18:
ВСТАВИТЬ в states_BACKUP
Выберите *
ИЗ СОСТОЯНИЙ;
когда я меняю код на
Select distinct *
FROM STATES;
Я получаю ту же ошибку.
Пытаясь найти ответ в Интернете, как решить эту проблему, я обнаружил, что эта ошибка связана с дублирующимися идентификаторами. Интересно, как это может произойти, когда я просто копирую таблицу.
У кого-нибудь есть решение для этого?
Комментарии:
1. Имеет ли исходная вкладка state_id, помеченная как первичный ключ?
2. Замените ваши
*
на явные имена столбцов и добавьте также явные имена столбцов вINSERT INTO
инструкцию. Никогда не используйтеINSERT INTO ... SELECT * FROM
в производственном коде , потому что вы никогда не узнаете, есть ли у вас несоответствующие столбцы.3. @ OMSoP state_id действительно помечен как первичный ключ. Я уже предположил, что это может быть проблемой, поэтому для создания резервной таблицы потеря этого не будет проблемой. Но когда я восстановлю данные, я столкнусь с той же проблемой, я полагаю, потому что это должен быть первичный ключ. @DAI, вы правы, но я не думаю, что здесь есть большой риск
4. @justme Я думаю, проблема в том, что у вас несоответствующие столбцы — это объясняет, почему он вставляет повторяющиеся значения в
state_id
столбец назначения, если он сопоставлен с другим исходным столбцом.5. @dai. Я бы не знал, как это должно произойти. Я использую код для создания таблицы, предоставляемой DBbrowser для создания исходной таблицы. Изменено только имя таблицы. Код вставки скопирован из кода для создания таблицы. Я не вводил имя поля или тип поля самостоятельно.