Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2019, 12:56   #1
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию Ошибка внешнего ключа при запросе - не пойму почему

Всем привет. Есть таблицы
Код:
CREATE TABLE crm.mains (
  id_mains INT(11) NOT NULL AUTO_INCREMENT,
  id_user INT(11) NOT NULL,
  date DATE NOT NULL,
  time_b TIME NOT NULL,
  time_e TIME NOT NULL,
  id_unit INT(11) DEFAULT NULL,
  id_cat INT(11) DEFAULT NULL,
  rec_price INT(7) DEFAULT NULL,
  comm VARCHAR(255) DEFAULT NULL,
  id_contr INT(11) DEFAULT NULL,
  `create` DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id_mains)
)
ENGINE = INNODB,
CHARACTER SET cp1251,
COLLATE cp1251_general_ci;

ALTER TABLE crm.mains 
  ADD CONSTRAINT FK_mains_id_contr FOREIGN KEY (id_contr)
    REFERENCES crm.contrs(id_contrs);

ALTER TABLE crm.mains 
  ADD CONSTRAINT FK_mains_id_unit FOREIGN KEY (id_unit)
    REFERENCES crm.units(id_units);

ALTER TABLE crm.mains 
  ADD CONSTRAINT FK_mains_id_user FOREIGN KEY (id_user)
    REFERENCES crm.users(id_users);
Код:

CREATE TABLE crm.units (
  id_units INT(11) NOT NULL AUTO_INCREMENT,
  unit VARCHAR(255) NOT NULL,
  comm VARCHAR(255) DEFAULT NULL,
  id_cat INT(11) DEFAULT NULL,
  `create` DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id_units)
)
ENGINE = INNODB,
AUTO_INCREMENT = 23,
AVG_ROW_LENGTH = 2730,
CHARACTER SET cp1251,
COLLATE cp1251_general_ci;

ALTER TABLE crm.units 
  ADD UNIQUE INDEX unit(unit);

ALTER TABLE crm.units 
  ADD CONSTRAINT FK_units_id_cat2 FOREIGN KEY (id_cat)
    REFERENCES crm.categories(id_cats);
Код делфи
Код:
// ---- Создать запись в БД ------------
function TFMain.Add_rec: bool;
begin
  with ADOQuery_main do
  begin
    Close;
    SQL.Clear;
    SQL.add('INSERT INTO mains');
    SQL.add('SET id_user=' + id_user + ',');

    if Addm.sCB_dat.Checked then
      SQL.add('date=CURDATE(), ')
    else
    begin
      SQL.add('date=:dat,');
      Parameters.ParamByName('dat').Value := FormatDateTime('yyyy.mm.dd',
        Addm.sDateEdit1.Date);
    end;

    SQL.add('time_b=:timeb,');
    Parameters.ParamByName('timeb').Value := Addm.sTimeP_b.Time;

    SQL.add('time_e=:timee,');
    Parameters.ParamByName('timee').Value := Addm.sTimeP_e.Time;

    if Addm.sDBLUCB_contr.Text <> '' then
    begin
      SQL.add('id_contr= :idcontr,');
      Parameters.ParamByName('idcontr').Value := Addm.sDBLUCB_contr.KeyValue;
    end;

    if Addm.sDBLUCB_unit.Text <> '' then
    begin
      SQL.add('id_unit=:idunit,');
      Parameters.ParamByName('idunit').Value := Addm.sDBLUCB_unit.KeyValue;
    end;

    if Addm.sEdit1.Text <> '' then
    begin
      SQL.add('comm=:comm');
      Parameters.ParamByName('comm').Value := Addm.sEdit1.Text;
    end
    else
      SQL.add('comm=NULL');
    ExecSQL;
  end;
  SQLUpdate;
  Result := True;
end;
Запрос SQL
Код:
INSERT INTO mains SET 
  id_user = 1, 
  date=CURDATE(),
  time_b = '18:45',
  time_e = '20:18',
  id_contr = 3,
  id_unit = 20,
  comm = 'КОММЕНТАРИЙ - тест';
Так вот: При запросе с консоли запрос проходит и запись создается. Но при попытке осуществить этот запрос в Делфи, выдает ошибку
Код:
[MySQL][ODBC 8.0(a) Driver][mysqld-8.0.15]Cannot add or update a child row: a foreign key constraint fails (`crm`.`mains`, CONSTRAINT `FK_mains_id_unit` FOREIGN KEY (`id_unit`) REFERENCES `units` (`id_units`))'
id_unit - 100% не пустой... проверял не однократно
Помогите, пожалуйста, второй день не могу победить!

Последний раз редактировалось iskurt; 09.03.2019 в 13:29.
iskurt вне форума Ответить с цитированием
Старый 09.03.2019, 13:27   #2
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Поменял кусок кода, на конкретное указание id_unit (без параметризации) - так работает
Код:
    if Addm.sDBLUCB_unit.Text <> '' then
    begin
      showmessage(IntToStr(Addm.sDBLUCB_unit.KeyValue));
      SQL.add('id_unit=20,'); //SQL.add('id_unit=:idunit,');
      //Parameters.ParamByName('idunit').Value := Addm.sDBLUCB_unit.KeyValue;
    end;
Что за херня!? Я же вижу что KeyValue такую же цифру выводит... хоть плачь блин!
Уже внешний ключ пересоздавал

Последний раз редактировалось iskurt; 09.03.2019 в 13:29.
iskurt вне форума Ответить с цитированием
Старый 09.03.2019, 13:28   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Причем тут пустой или нет?.. В таблице units есть запись с таким id_units?
p51x на форуме Ответить с цитированием
Старый 09.03.2019, 13:32   #4
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

есть, сорри, мужики, нашел ошибку, причем случайно, я не правильный параметр передавал... уже исправил...
iskurt вне форума Ответить с цитированием
Старый 09.03.2019, 13:37   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
    if Addm.sDBLUCB_unit.Text <> '' then
    begin
      SQL.add('id_unit=:idunit,');
      Parameters.ParamByName('idunit').Value := Addm.sDBLUCB_contr.KeyValue;
    end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.03.2019, 13:47   #6
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Да, именно тут была ошибка
iskurt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание внешнего ключа aleksskay БД в Delphi 2 12.10.2014 15:06
Добавление внешнего ключа Ericnex БД в Delphi 6 02.05.2012 23:42
with ... do - не пойму почему ошибка MyLastHit Общие вопросы Delphi 2 23.12.2010 15:26
Не пойму почему ошибка... ImmortalAlexSan Общие вопросы Delphi 13 22.08.2010 20:26