Skip to content

Commit a53d5d3

Browse files
docs: add mysql 1452 | pg 57p01 (#1066)
* add mysql 1452 | pg 57p01 * Update content/reference/mysql/error/1452-cannot-add-child-row.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update content/reference/postgres/error/57p01-admin-shutdown-postgres.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 14aa72e commit a53d5d3

2 files changed

Lines changed: 433 additions & 0 deletions

File tree

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
---
2+
title: 'ERROR 1452 (23000): Cannot Add or Update a Child Row in MySQL'
3+
---
4+
5+
## Error Message
6+
7+
```sql
8+
ERROR 1452 (23000): Cannot add or update a child row:
9+
a foreign key constraint fails (`mydb`.`orders`, CONSTRAINT `fk_orders_customer`
10+
FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`))
11+
```
12+
13+
Other common variations:
14+
15+
```sql
16+
ERROR 1452 (23000): Cannot add or update a child row:
17+
a foreign key constraint fails (`mydb`.`order_items`, CONSTRAINT `fk_items_order`
18+
FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE)
19+
```
20+
21+
## What Triggers This Error
22+
23+
MySQL 1452 fires when an INSERT or UPDATE tries to set a foreign key column to a value that doesn't exist in the referenced parent table. The fix depends on why the parent row is missing or unmatched:
24+
25+
- **Parent row doesn't exist** — inserting a FK value with no matching row in the parent table
26+
- **Data type mismatch** — FK column and referenced column have different types (INT vs BIGINT, signed vs unsigned)
27+
- **Character set or collation mismatch** — parent and child columns use different character sets
28+
- **Self-referencing foreign key** — inserting a row that references itself or a not-yet-inserted row
29+
- **Bulk import with wrong insertion order** — child rows loaded before parent rows
30+
31+
## Fix by Scenario
32+
33+
### Parent row doesn't exist
34+
35+
The most common cause. You're inserting a row with a `customer_id` of 42, but there's no customer with `id = 42` in the parent table.
36+
37+
```sql
38+
-- Check if the referenced parent row exists
39+
SELECT id FROM customers WHERE id = 42;
40+
-- Empty result = that's your problem
41+
42+
-- Option 1: insert the parent row first
43+
INSERT INTO customers (id, name) VALUES (42, 'Acme Corp');
44+
INSERT INTO orders (customer_id, total) VALUES (42, 99.99);
45+
46+
-- Option 2: if the parent was deleted, check if it's expected
47+
-- Maybe the application should use ON DELETE SET NULL instead of RESTRICT
48+
```
49+
50+
If parent rows are frequently missing due to race conditions in concurrent inserts, wrap the parent + child inserts in a single transaction:
51+
52+
```sql
53+
START TRANSACTION;
54+
INSERT INTO customers (id, name) VALUES (42, 'Acme Corp');
55+
INSERT INTO orders (customer_id, total) VALUES (42, 99.99);
56+
COMMIT;
57+
```
58+
59+
### Data type mismatch between FK columns
60+
61+
The FK column and the referenced column must have the exact same data type. A common trap: `INT UNSIGNED` in the parent vs `INT` (signed) in the child, or `INT` vs `BIGINT`.
62+
63+
```sql
64+
-- Check column types for both tables
65+
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE
66+
FROM information_schema.COLUMNS
67+
WHERE TABLE_SCHEMA = 'mydb'
68+
AND ((TABLE_NAME = 'customers' AND COLUMN_NAME = 'id')
69+
OR (TABLE_NAME = 'orders' AND COLUMN_NAME = 'customer_id'));
70+
71+
-- Example output showing the mismatch:
72+
-- customers | id | int unsigned
73+
-- orders | customer_id | int <-- signed vs unsigned
74+
```
75+
76+
**Fix:** Alter the child column to match the parent exactly:
77+
78+
```sql
79+
-- Drop the FK, fix the type, re-add the FK
80+
ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer;
81+
ALTER TABLE orders MODIFY customer_id INT UNSIGNED NOT NULL;
82+
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer
83+
FOREIGN KEY (customer_id) REFERENCES customers(id);
84+
```
85+
86+
### Character set or collation mismatch
87+
88+
For string-type foreign keys (e.g., `VARCHAR` codes), both columns must use the same character set and collation. A `utf8mb4` parent with a `utf8` child will fail.
89+
90+
```sql
91+
-- Check character set and collation for both columns
92+
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
93+
FROM information_schema.COLUMNS
94+
WHERE TABLE_SCHEMA = 'mydb'
95+
AND COLUMN_NAME IN ('country_code')
96+
AND TABLE_NAME IN ('countries', 'addresses');
97+
98+
-- Example mismatch:
99+
-- countries | country_code | utf8mb4 | utf8mb4_general_ci
100+
-- addresses | country_code | utf8 | utf8_general_ci
101+
```
102+
103+
**Fix:**
104+
105+
```sql
106+
ALTER TABLE addresses DROP FOREIGN KEY fk_addresses_country;
107+
ALTER TABLE addresses MODIFY country_code VARCHAR(3)
108+
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;
109+
ALTER TABLE addresses ADD CONSTRAINT fk_addresses_country
110+
FOREIGN KEY (country_code) REFERENCES countries(country_code);
111+
```
112+
113+
### Self-referencing foreign key
114+
115+
A table that references itself (e.g., an `employees` table with `manager_id``id`). The first row fails because there's no parent row yet.
116+
117+
```sql
118+
-- This fails: manager_id=1 doesn't exist yet
119+
INSERT INTO employees (id, name, manager_id) VALUES (1, 'CEO', 1);
120+
121+
-- ERROR 1452: Cannot add or update a child row
122+
```
123+
124+
**Fix:** Insert the root row with `NULL` for the self-reference, then update it:
125+
126+
```sql
127+
-- Option 1: allow NULL for the root
128+
INSERT INTO employees (id, name, manager_id) VALUES (1, 'CEO', NULL);
129+
130+
-- Option 2: temporarily disable FK checks (use with caution)
131+
SET FOREIGN_KEY_CHECKS = 0;
132+
INSERT INTO employees (id, name, manager_id) VALUES (1, 'CEO', 1);
133+
SET FOREIGN_KEY_CHECKS = 1;
134+
```
135+
136+
For hierarchical data, it's common practice to allow `NULL` on the self-referencing FK to represent the root node.
137+
138+
### Bulk import with wrong insertion order
139+
140+
When loading data from a dump or CSV, child table rows loaded before their parent rows will fail. This is the most common cause during migrations.
141+
142+
```sql
143+
-- This fails because orders references customers, but customers isn't loaded yet
144+
LOAD DATA INFILE 'orders.csv' INTO TABLE orders;
145+
146+
-- ERROR 1452: Cannot add or update a child row
147+
```
148+
149+
**Fix:**
150+
151+
```sql
152+
-- Option 1: load tables in dependency order
153+
LOAD DATA INFILE 'customers.csv' INTO TABLE customers;
154+
LOAD DATA INFILE 'orders.csv' INTO TABLE orders;
155+
LOAD DATA INFILE 'order_items.csv' INTO TABLE order_items;
156+
157+
-- Option 2: disable FK checks during the entire import
158+
SET FOREIGN_KEY_CHECKS = 0;
159+
LOAD DATA INFILE 'order_items.csv' INTO TABLE order_items;
160+
LOAD DATA INFILE 'orders.csv' INTO TABLE orders;
161+
LOAD DATA INFILE 'customers.csv' INTO TABLE customers;
162+
SET FOREIGN_KEY_CHECKS = 1;
163+
164+
-- IMPORTANT: verify data integrity after re-enabling
165+
-- Find orphaned child rows
166+
SELECT o.id, o.customer_id
167+
FROM orders o
168+
LEFT JOIN customers c ON o.customer_id = c.id
169+
WHERE c.id IS NULL;
170+
```
171+
172+
`mysqldump` handles this automatically by adding `SET FOREIGN_KEY_CHECKS = 0` at the top of the dump file.
173+
174+
## Prevention
175+
176+
- Always insert parent rows before child rows — enforce this in your application's data layer
177+
- Use consistent data types for FK columns — prefer `BIGINT UNSIGNED` for all ID columns across the schema
178+
- Standardize on `utf8mb4` and a single collation across all tables
179+
- When writing migration scripts, order the inserts by table dependency (parents first)
180+
- After bulk imports with `FOREIGN_KEY_CHECKS = 0`, always run integrity checks to find orphaned rows
181+
182+
<HintBlock type="info">
183+
184+
Bytebase's [SQL Review](https://docs.bytebase.com/sql-review/review-rules/) can enforce consistent column types across foreign key relationships during schema change review. See also [ERROR 1451: Cannot Delete or Update a Parent Row](/reference/mysql/error/1451-cannot-delete-parent-row) for the reverse direction (deleting a parent that has children).
185+
186+
</HintBlock>

0 commit comments

Comments
 (0)