За последние 24 часа нас посетили 20248 программистов и 1081 робот. Сейчас ищут 696 программистов ...

Laravel - не удаляется внешний ключ из БД

Тема в разделе "PHP для новичков", создана пользователем Alexandrinho, 10 сен 2020.

  1. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте!

    Есть таблица 'products', в ней внешний ключ 'texture_id' из таблицы 'textures':
    Код (Text):
    1. Schema::table('products', function (Blueprint $table) {
    2.             $table->unsignedBigInteger('texture_id')->nullable();
    3.             $table->foreign('texture_id')->references('id')->on('textures')->onDelete('set null');
    4.         });
    Необходимо удалить поле 'texture_id' из 'products':
    Код (Text):
    1. Schema::table('products', function (Blueprint $table) {
    2.             $table->dropForeign(['texture_id']);
    3.             $table->dropColumn('texture_id');
    4.         });
    Но появляется ошибка:
    Код (Text):
    1. SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP FOREIGN KEY `products_texture_id_foreign`; check that it exists (SQL: alter table `products` drop foreign key `products_texture_id_foreign`)
    Что не так то? Я же вижу, что ключ существует.
    Код (Text):
    1. dropForeign('products_texture_id_foreign')
    также не срабатывает, понятно, что одно и то же, но я уже не знаю, что и делать. От доки толку 0, судя по ней, все должно работать, помогите, пожалуйста.
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Зайдите в phpMyAdmin
    И выполните:
    Код (Text):
    1. SHOW CREATE table `products`
    Найдите как называется ваш ключ на самом деле и удалите его.
     
  3. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Выполнил, результат -
    Код (Text):
    1. CREATE TABLE `products` (
    2. `id` bigint(20) unsign...
    дальше не посмотреть.
    Но в Структуре таблицы и в дереве (слева) он называется именно `products_texture_id_foreign`, разве может как-то по-другому?
    Даже если в дереве попытаться его редактировать и нажать Предпросмотр SQL - видим
    Код (Text):
    1. ALTER TABLE `tiles_eshop`.`products` DROP INDEX `products_texture_id_foreign`, ADD INDEX `products_texture_id_foreign` (`texture_id`) USING BTREE;
    . Снова `products_texture_id_foreign`.
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Нажмите +параметры>Развернутое отображение данных>OK
    --- Добавлено ---
    Может.
     
  5. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Вот полный текст, там такое же имя ключа:
    Код (Text):
    1. CREATE TABLE `products` (
    2. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    3. `code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    4. `price` decimal(12,2) NOT NULL,
    5. `collection_id` bigint(20) unsigned DEFAULT NULL,
    6. `color` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    7. `shape_id` bigint(20) unsigned DEFAULT NULL,
    8. `material_id` bigint(20) unsigned DEFAULT NULL,
    9. `surface_id` bigint(20) unsigned DEFAULT NULL,
    10. `texture_id` bigint(20) unsigned DEFAULT NULL,
    11. `style_id` bigint(20) unsigned DEFAULT NULL,
    12. `length` bigint(20) DEFAULT NULL,
    13. `width` bigint(20) DEFAULT NULL,
    14. `weight` bigint(20) DEFAULT NULL,
    15. `in_box` bigint(20) DEFAULT NULL,
    16. `views` bigint(20) DEFAULT 0,
    17. `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
    18. `created_at` timestamp NULL DEFAULT NULL,
    19. `updated_at` timestamp NULL DEFAULT NULL,
    20. PRIMARY KEY (`id`),
    21. UNIQUE KEY `products_code_unique` (`code`),
    22. UNIQUE KEY `products_url_unique` (`url`),
    23. KEY `products_collection_id_foreign` (`collection_id`),
    24. KEY `products_shape_id_foreign` (`shape_id`),
    25. KEY `products_material_id_foreign` (`material_id`),
    26. KEY `products_surface_id_foreign` (`surface_id`),
    27. KEY `products_texture_id_foreign` (`texture_id`),
    28. KEY `products_style_id_foreign` (`style_id`),
    29. CONSTRAINT `products_collection_id_foreign` FOREIGN KEY (`collection_id`) REFERENCES `collections` (`id`) ON DELETE SET NULL,
    30. CONSTRAINT `products_material_id_foreign` FOREIGN KEY (`material_id`) REFERENCES `materials` (`id`) ON DELETE SET NULL,
    31. CONSTRAINT `products_shape_id_foreign` FOREIGN KEY (`shape_id`) REFERENCES `shapes` (`id`) ON DELETE SET NULL,
    32. CONSTRAINT `products_style_id_foreign` FOREIGN KEY (`style_id`) REFERENCES `styles` (`id`) ON DELETE SET NULL,
    33. CONSTRAINT `products_surface_id_foreign` FOREIGN KEY (`surface_id`) REFERENCES `surfaces` (`id`) ON DELETE SET NULL
    34. ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    --- Добавлено ---
    Ничего не понимаю, сейчас выполнил
    Код (Text):
    1. $table->dropColumn('texture_id');
    - поле удалилось, вчера тоже так делал, не работало...И куда подевался ключ?
     
  6. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Все, я понял, как надо делать:

    Сначала отключаем ForeignKeyConstraints, удаляем ключ, и включаем опять:

    Код (Text):
    1. Schema::disableForeignKeyConstraints();
    2.  
    3. Schema::table('products', function (Blueprint $table) {
    4.             $table->dropForeign(['texture_id']);
    5.         });
    6.  
    7. Schema::enableForeignKeyConstraints();
    8.  
    9. Schema::table('products', function (Blueprint $table) {
    10.             $table->dropColumn('texture_id');
    11.         });
    И все ок.
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Это не внешний ключ. Это просто индекс. В приведённом коде с alter table, кстати, об этом прямо написано :)
    Вот то, что начинается с "CONSTRAINT" - ограничения по внешнему ключу.
     
  8. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Ясно, спасибо.