66 lines
1.9 KiB
Markdown
66 lines
1.9 KiB
Markdown
# Решение проблемы Foreign Key при удалении тарифов
|
||
|
||
## Проблема
|
||
При попытке удалить тариф через Prisma Studio появляется ошибка:
|
||
```
|
||
Foreign key constraint violated on the fields: (`tariffId`)
|
||
```
|
||
|
||
## Причина
|
||
Тариф используется серверами. MySQL не позволяет удалить тариф, если на него ссылаются записи в таблице `server`.
|
||
|
||
## Решение
|
||
|
||
### Способ 1: Безопасный (рекомендуется)
|
||
Удаляет только неиспользуемые тарифы, сохраняет серверы.
|
||
|
||
```bash
|
||
mysql -u root -p ospabhost < backend/prisma/safe_tariff_migration.sql
|
||
```
|
||
|
||
### Способ 2: Полная очистка (только для dev!)
|
||
Удаляет ВСЕ серверы и тарифы.
|
||
|
||
```bash
|
||
# Сначала бэкап!
|
||
mysqldump -u root -p ospabhost > backup.sql
|
||
|
||
# Потом очистка
|
||
mysql -u root -p ospabhost < backend/prisma/clean_slate_migration.sql
|
||
```
|
||
|
||
### Способ 3: Ручное удаление через SQL
|
||
|
||
```sql
|
||
-- 1. Найти тарифы без серверов
|
||
SELECT t.id, t.name, COUNT(s.id) as servers
|
||
FROM tariff t
|
||
LEFT JOIN server s ON s.tariffId = t.id
|
||
GROUP BY t.id
|
||
HAVING servers = 0;
|
||
|
||
-- 2. Удалить только неиспользуемые
|
||
DELETE FROM tariff WHERE id IN (
|
||
SELECT id FROM (
|
||
SELECT t.id FROM tariff t
|
||
LEFT JOIN server s ON s.tariffId = t.id
|
||
GROUP BY t.id
|
||
HAVING COUNT(s.id) = 0
|
||
) as unused
|
||
);
|
||
|
||
-- 3. Добавить категорию
|
||
ALTER TABLE tariff ADD COLUMN category VARCHAR(50) NOT NULL DEFAULT 'vps';
|
||
|
||
-- 4. Добавить новые тарифы (см. safe_tariff_migration.sql)
|
||
```
|
||
|
||
## Перезапуск backend
|
||
|
||
```bash
|
||
cd backend
|
||
npm start
|
||
```
|
||
|
||
Готово! 🎉
|