Сбой уникального ограничения sqlite

#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 для создания исходной таблицы. Изменено только имя таблицы. Код вставки скопирован из кода для создания таблицы. Я не вводил имя поля или тип поля самостоятельно.