Вставка нарушения ограничения MySQL в родительскую таблицуPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Вставка нарушения ограничения MySQL в родительскую таблицу

Сообщение Anonymous »

Я только изучаю 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:

Код: Выделить всё

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;
Таблица aq_customers:

Код: Выделить всё

    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;
Запрос, выдающий ошибку:

Код: Выделить всё

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`
;

Код: Выделить всё

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',
)
где project_id является элементом 15 в массиве: '3f7265f4-57b3-40d5-b4dd-ceaad93ae4a6`

Код: Выделить всё

aq_customers
ссылается на aq_project, поэтому я не понимаю, почему я не могу вставить запись в родительскую таблицу, не вызвав этого нарушения. Параметр fk в aq_customers используется для каскадного удаления записей проекта из aq_customers при удалении проекта из aq_project.
Из SQLyog:
Изображение

Спасибо. ты.

Подробнее здесь: https://stackoverflow.com/questions/792 ... rent-table
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»