powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Update (Delete->Insert) ошибка 1884
11 сообщений из 11, страница 1 из 1
Update (Delete->Insert) ошибка 1884
    #32614591
BLOBx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица (Table12) ключ (Id12) которой это ид (Id1, Id2) из других двух таблиц (Table1, Table2). Через курсорадаптер произвожу апдейт (UpdateType = 2, Delete old data and insert new data). Выскакивает ошибка Uniqueness of index "name" is violated ( Error 1884 ). Id12 = (Id1, Id2) - уникальный однозначно.
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32614615
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помеченые на удаление записи также принимаюца во внимание уникальности
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32616968
BLOBx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самое интересное, что если делать DELETE/INSERT напрямую из среды, то ошибок не возникает:
Код: plaintext
1.
DELETE FROM Table12 WHERE Id1 = <значение>
INSERT INTO Table12 (Id1,Id2) SELECT Id1,Id2 FROM <временная таблица> 
а в курсорадаптере возникает. Может чего не учитываю?
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617129
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А такое из среды проходит?

Код: plaintext
1.
2.
lcValue = <значение>
DELETE FROM Table12 WHERE Id1 = m.lcValue
INSERT INTO Table12 (Id1) VALUES (m.lcValue)

Hel!Riser тебе уже написал, что команда DELETE физически не удаляет записи из таблицы, а только помечает их как удаленные. Если по ключевому полю есть индекс Primary или Candidat, то попытка после такого удаления вставить запись с тем же значением и вызовет данное сообщение об ошибке.
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617266
BLOBx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
lcValue = <значение>
DELETE FROM Table12 WHERE Id1 = m.lcValue
INSERT INTO Table12 (Id1) VALUES (m.lcValue)
Проходит. Не могу понять, что происходит. То, что записи помечаются как удаленные, так это не страшно - Id2 для каждого INSERT разная. У меня вся логика на курсорадаптарах.
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617329
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ведь ты поставил UpdateType = 2 - это значит, что при изменении содержимого вспомогательных полей модификация данных пойдет не по UPDATE, а по DELETE+INSERT и вот тут-то id1 будет ОДИНАКОВ.

Т.е. ты попытаешся создать запись с тем же id1, который только что удалил.
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617414
BLOBx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И Id1 , и Id2 входят в Primary key таблицы Table12 , получается кортеж (Id1,Id2) . Так как Id2 для каждого INSERT разная, то нарушение целостности не будет при одинаковых Id1. Мне кажется, ошибка где-то в настройках моего курсорадаптера или еще где-то. Можно ли узнать точно какие значение курсорадаптер заности в таблицу во время TABLEUPDATE()?
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617462
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это тебе самому надо проверять. Создай табличку из одной записи (или измени только одну запись) и экспериментируй чего ты не задал. Скорее всего, либо не было изменено id1+id2, либо они не включены в список обновляемых полей.

Можно узнать с какой целью ты вообще подключаешся к DBF-таблицам через ODBC?

А зачем нужен такой экзотический режим как UpdateType = 2 ?
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617489
BLOBx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Можно узнать с какой целью ты вообще подключаешся к DBF-таблицам через ODBC?
NATIVE
ВладимирМ
А зачем нужен такой экзотический режим как UpdateType = 2 ?
Работа со списками
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617522
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял. Это ты о чем?

Вообще, чтобы не было подобных проблем создавай для всех без исключения таблиц собственный суррогатный ключ. Это тебе сейчас кажется, что для однозначной идентификации достаточно id1+id2, но при дальнейшем развитии базы данных может оказаться, что этого уже недостаточно.

Лично я ни в коем случае не стал бы совмещать функции. В твоем случае - совмещение Primary и Foreign key.

Кое-что по идеологии Primary key можешь почитать здесь

http://www.foxclub.ru/kb/index.php?sid=24056&aktion=artikel&rubrik=001&id=6&lang=ru

Раздел "Ключевое поле", подраздел "Надо ли использовать ключевое поле во всех без исключения таблицах". Там как раз рассматривается пример таблицы-посредника для связи много-ко-многим
...
Рейтинг: 0 / 0
Update (Delete->Insert) ошибка 1884
    #32617686
BLOBx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, ВладимирМ
Вы знаете дело все оказалось в том, что курсорадаптер выполняет DELETE/INSERT для каждой записей. Для DELETE все нормально, а вот для INSERT одна и таже команда выполяется несколько раз, как результат - ошибка при втором INSERT. Есть ли режим курсорадаптера, при котором он выполняет один DELETE/INSERT для всех записей разом или надо самому писать?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Update (Delete->Insert) ошибка 1884
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]