Обобщенная идентификация rowid, вызывающего конфликт ограничений в SQLite - PullRequest
0 голосов
/ 25 ноября 2018

Мне нужно определить строку, которая вызвала сбой проверки ограничения после оператора INSERT OR IGNORE.

Мне это нужно для инструмента, который генерирует операторы SQL, поэтому я не могу связать это с конкретнымвариант использования с конкретной таблицей.

Проблема в том, что я не могу знать, какие ограничения установлены для конкретной таблицы, в которую я буду вставлять.Он может иметь внешний ключ или ограничения UNIQUE, или даже присоединенное предложение CHECK.

Итак, все, что я могу узнать из INSERT, это то, что он потерпел неудачу.Теперь, как узнать, какая строка прервала вставку?

Уточнение:

Мне нужно решение, которое использует операторы / выражения SQLто есть я не могу писать код, отличный от SQL.

Бонусный вопрос, если в SQLite это невозможно:

Можно ли это сделать вPostgresql или MySQL?

Пример использования

Вот пример использования этой функции (см. 2-й пример и примечание наконец, указывающий на этот вопрос): https://stackoverflow.com/a/53461201/43615

1 Ответ

0 голосов
/ 26 ноября 2018

Это невозможно даже в теории.

Не все ошибки ограничений связаны с данными вне вставляемой строки.Например, ограничения CHECK часто не будут.В этом случае не будет идентификатора строки для отчета.

INSERT может не выполнить несколько ограничений, примененных к различным строкам в других таблицах.Какой из них вас заинтересует?

Если есть способ узнать, в какой таблице строке находится строка на основе идентификатора строки, я не знаю, что это, поэтомунеобработанный идентификатор строки, вероятно, не будет использоваться.

Наконец, идентификаторы строк в SQLite являются необязательными;Вы можете создать таблицу со столбцом id строки, используя WITHOUT ROWID.

...