Я только изучаю PHP/MySQL и столкнулся с этим. Я просмотрел stackoverflow, но не нашел ничего, что помогло бы мне решить проблему.
Это работает под PHP 7.4.27/MySQL 8.0.21.
Мой первоначальный вопрос был опубликован с усеченными таблицами, чтобы сократить длину сообщения. Я обновил его, добавив полное описание таблицы и точный запрос, который использую.
Я получаю:
SQLSTATE[23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (`evifs_aqqbo`.`aq_customers`, CONSTRAINT `fk_cust_proj` ВНЕШНИЙ КЛЮЧ (`project_id`) ССЫЛКИ на `aq_project` (`project_id`) ПРИ КАСКАДНОМ УДАЛЕНИИ)
при вставке новой записи в aq_project таблица.
таблица aq_project:
ссылается на aq_project, поэтому я не понимаю, почему я не могу вставить запись в родительскую таблицу, не вызвав этого нарушения. Параметр fk в aq_customers используется для каскадного удаления записей проекта из aq_customers при удалении проекта из aq_project.
Из SQLyog:
Я только изучаю PHP/MySQL и столкнулся с этим. Я просмотрел stackoverflow, но не нашел ничего, что помогло бы мне решить проблему. Это работает под PHP 7.4.27/MySQL 8.0.21. Мой первоначальный вопрос был опубликован с усеченными таблицами, чтобы сократить длину сообщения. Я обновил его, добавив полное описание таблицы и точный запрос, который использую. Я получаю:
SQLSTATE[23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (`evifs_aqqbo`.`aq_customers`, CONSTRAINT `fk_cust_proj` ВНЕШНИЙ КЛЮЧ (`project_id`) ССЫЛКИ на `aq_project` (`project_id`) ПРИ КАСКАДНОМ УДАЛЕНИИ)
при вставке новой записи в aq_project таблица. таблица aq_project: [code]CREATE TABLE `aq_customers` ( `customer_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `parent_id` int DEFAULT NULL, `qb_Customer_id` int DEFAULT NULL, `customer_address_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `customer_specific_sales_tax` decimal(5,2) DEFAULT NULL, `customer_specific_markup` decimal(5,2) DEFAULT NULL, `export_id` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `jobref` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `project_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `jobref_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`customer_id`,`project_id`,`jobref_code`), KEY `indx_custs_cust_addrid` (`customer_address_id`), KEY `indx_li_sli` (`project_id`), CONSTRAINT `fk_cust_proj` FOREIGN KEY (`project_id`) REFERENCES `aq_project` (`project_id`) ON DELETE CASCADE, CONSTRAINT `fk_custs_cust_addrid` FOREIGN KEY (`customer_address_id`) REFERENCES `aq_addressrepository` (`address_id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; [/code] Таблица aq_customers: [code] CREATE TABLE `aq_project` ( `project_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `jobref` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `jobref_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `project_name` varchar(75) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `contract_match` int DEFAULT NULL, `parent_id` int DEFAULT NULL, `aq_dealer_rep` int DEFAULT '0', `create_date` date DEFAULT NULL, `modified_date` date DEFAULT NULL, `bid_date` date DEFAULT NULL, `good_until_date` date DEFAULT NULL, `project_address_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `freight_sell_override` decimal(10,2) DEFAULT NULL, `installation_sell_override` decimal(10,2) DEFAULT NULL, `freight_taxable` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `installation_taxable` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `locksell` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `sales_tax_percent` decimal(5,2) DEFAULT NULL, `sales_tax_override` decimal(5,2) DEFAULT NULL, `marketing_category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `read_only` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `read_only_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `password_protected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `custom_filter` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `memo` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, `opportunity_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `converted_prices_currency_symbol` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `converted_sell_price` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `converted_prices_currency_exchange_rate` decimal(6,3) DEFAULT NULL, `custom_column_3_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `custom_column_1_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `custom_column_2_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `date_db_modified` datetime DEFAULT CURRENT_TIMESTAMP, `warehouse` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `duplicated_projects` int DEFAULT NULL, `install_date` date DEFAULT NULL, `isService` tinyint(1) DEFAULT '0', `track_proj` enum('Yes','No') COLLATE utf8mb4_unicode_ci DEFAULT NULL, `do_not_track_proj` tinyint DEFAULT NULL, `qbo_customer_status` enum('true','false') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `dealer_rep_address_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `project_coordinator_address_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `dealer_rep` varchar(25) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `class_id` varchar(25) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `customer_address_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `parent_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`project_id`,`jobref_code`), UNIQUE KEY `INDX_jobref_code` (`jobref_code`), KEY `indx_proj_jobref` (`jobref`), KEY `indx_proj_project_addrid` (`project_address_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; [/code] Запрос, выдающий ошибку: [code]INSERT INTO aq_project (`code`,`create_date`,`password_protected`,`read_only_description` ,`read_only`,`sales_tax_percent`,`installation_taxable`,`freight_taxable` ,`freight_sell_override`,`project_address_id`,`good_until_date`,`bid_date` ,`modified_date`,`project_name`,`jobref`,`project_id` ,`status`,`locksell`,`custom_column_1_name`,`track_proj` ,`jobref_code`,`dealer_rep`,`dealer_rep_address_id`,`class_id` ,`project_coordinator_address_id` ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) as NEW ON DUPLICATE KEY UPDATE `code` = new.`code`, `create_date` = new.`create_date` , `password_protected` = new.`password_protected` , `read_only_description` = new.`read_only_description` , `read_only` = new.`read_only` , `sales_tax_percent` = new.`sales_tax_percent` , `installation_taxable` = new.`installation_taxable` , `freight_taxable` = new.`freight_taxable` , `freight_sell_override` = new.`freight_sell_override` , `project_address_id` = new.`project_address_id` , `good_until_date` = new.`good_until_date` , `bid_date` = new.`bid_date` , `modified_date` = new.`modified_date` , `project_name` = new.`project_name` , `jobref` = new.`jobref` , `project_id` = new.`project_id` , `status` = new.`status` , `locksell` = new.`locksell` , `custom_column_1_name` = new.`custom_column_1_name` , `track_proj` = new.`track_proj` , `jobref_code` = new.`jobref_code` , `dealer_rep` = new.`dealer_rep` , `dealer_rep_address_id` = new.`dealer_rep_address_id` , `class_id` = new.`class_id` , `project_coordinator_address_id` = new.`project_coordinator_address_id` ; [/code] [code]where $values = array ( 0 => 'CONTRACT', 1 => '2024-12-10', 2 => 'true', 3 => 'Not Read Only', 4 => '0', 5 => '7', 6 => 'true', 7 => 'true', 8 => '1200', 9 => '15e149c4-0f04-49e1-8761-d70ede7332f6', 10 => '2025-01-09T12:27:54.6841706', 11 => '2024-12-10T12:27:54.6841706', 12 => '2024-12-11', 13 => '242011 Tom\'s Sub Shop Charles Town, WV', 14 => '242011', 15 => '3f7265f4-57b3-40d5-b4dd-ceaad93ae4a6', 16 => 'Active', 17 => '', 18 => 'Water AFF', 19 => 'Yes', 20 => '242011_CONTRACT', 21 => 'Long L', 22 => 'b159136f-e9a7-4e15-8781-7a92929ddb03', 23 => '4100000000000368102', 24 => 'e0c456ff-655c-4c9a-99a3-3f567ed2b16f', ) [/code] где project_id является элементом 15 в массиве: '3f7265f4-57b3-40d5-b4dd-ceaad93ae4a6` [code]aq_customers[/code] ссылается на aq_project, поэтому я не понимаю, почему я не могу вставить запись в родительскую таблицу, не вызвав этого нарушения. Параметр fk в aq_customers используется для каскадного удаления записей проекта из aq_customers при удалении проекта из aq_project. Из SQLyog: [img]https://i.sstatic.net/88xjOHTK.png[/img]