Удаление таблицы с внешним ключом

Я пытаюсь удалить столбец с внешним ключом. Я сижу на этом какое-то время, знаю, и мне кажется, что я что-то наблюдаю, и маркер должен быть очевиден, но я просто не понимаю. Ошибка, которую я получаю из журналов:

PHP Fatal error: Cannot declare class User, because the name is already in use user_id is a foreign key of the Identifier from the Class user.

Я использую базу данных InnoDB. Я пробовал это:

  $drop = 'ALTER TABLE `Group` DROP FOREIGN KEY `user_id`';
    $stmt = $conn->prepare($drop);
    $stmt->execute();

Однако это не повлияло ни на какие ошибки в журналах или что-то еще.

Прошу прощения, если это очевидно, я студент, и это моя 3-я неделя. ¯_ (ツ) _ / ¯

<?php
      require 'connect.php';
      require 'model.php';
      $identifier = null;

      if(!empty($_GET['identifier'])) {
        $identifier = $_REQUEST['identifier'];
      }


      if(!empty($_POST)) {
        require 'connect.php';
        require 'model.php';


        $identifier = $_REQUEST['identifier'];
        settype($identifier, 'integer');
        $group = Group::retrieve($conn, $_GET['identifier']);


        Group::delete($conn, $group);
        header('Location: view.php');
      } else {
        echo 'Its not working';
      }

    ?>

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='utf-8'>
  <link href='bootstrap/bootstrap/css/bootstrap.min.css' rel='stylesheet'>
  <script src='bootstrap/bootstrap/js/bootstrap.min.js'></script>
</head>

<body>
  <div class='container'>

    <div class='span10 offset1'>
      <div class='row'>
        <h3>Delete</h3>
      </div>

      <form class='form-horizontal' action='delete.php?identifier=<?php echo $identifier?>' method='post'>
        <input type='hidden' name='identifier' value='<?php echo $identifier;?>'/>
        <p class='alert alert-error'>DO YOU REALLY WANT TO Delete?</p>
        <div class='form-actions'>
          <button type='submit' class='btn btn-danger'>EXTERMINATE</button>
          <a class='btn' href='view.php'>No</a>
        </div>
      </form>
    </div>

  </div>
</body>
</html>

Соответствующие части Class Group в моей модели выглядят так:

 public static function retrieve($conn, $identifier) {
    $query = 'SELECT * FROM `Group` WHERE `identifier` = :identifier';
    $stmt = $conn->prepare($query);
    $stmt->bindParam(':identifier', $identifier, PDO::PARAM_INT);
    $stmt->execute();

    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    return new Group((int)$result['identifier'], $result['admin'], 
   $result['superuser'], $result['testaccount'], (int)$result['user_id']);
   }

  public static function delete($conn, Group $group) {
    $query = 'DELETE FROM `Group` WHERE identifier = :identifier, admin = :admin,
    superuser = :superuser, testaccount = :testaccount, user_id = :user_id';

    $stmt = $conn->prepare($query);

    $stmt->bindValue(':identifier', $group->getIdentifier(), PDO::PARAM_INT);
    $stmt->bindValue(':admin', $group->getAdmin(), PDO::PARAM_STR);
    $stmt->bindValue(':superuser', $group->getSuperuser(), PDO::PARAM_STR);
    $stmt->bindValue(':testaccount', $group->getTestaccount(), PDO::PARAM_STR);
    $stmt->bindValue(':user_id', $group->getUser_id(), PDO::PARAM_INT);

    $stmt->execute();

    return TRUE;

  }

Что касается запросов, то сначала вы можете попробовать выполнить его на консоли MySQL (phpmyadmin или mysql workbench и т. д.), Чтобы увидеть, работает он или нет. если он работает, значит проблема в php-коде. в противном случае ваш запрос неверен. Это помогает сэкономить много времени.

Krishnadas PC 10.09.2018 09:11

Спасибо! Это очень помогло! Мой босс на самом деле уже упоминал об этом, но я был настолько поражен новой информацией, что забыл.

Yranna 10.09.2018 09:43
0
2
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проверьте это, если ваш запрос завершился неудачно в консоли MySql. если это не удалось, это означает, что имя ограничения может быть неправильным. Если это так, попробуйте следующий код. Внешний ключ должен быть удален с помощью имя ограничения, а не по имени столбца.

Чтобы получить имя ограничения, вы можете использовать

SHOW CREATE TABLE Group

ALTER TABLE `Group` DROP FOREIGN KEY `your_constraint_name_here`

Более подробную информацию можно найти на сайте

MySQL Удаление некоторых внешних ключей

Ответ принят как подходящий

Спасибо за помощь. У меня была ошибка в моем коде, чтобы удалить внешний ключ, он работал с этим:

 $drop = 'ALTER TABLE `Group` DROP FOREIGN KEY `Group_ibfk_1`';
 $stmt = $conn->prepare($drop);
 $stmt->execute();

Также в функции удаления должно быть AND вместо запятой, например:

$query = 'DELETE FROM `Group` WHERE identifier = :identifier AND admin = :admin AND
    superuser = :superuser AND testaccount = :testaccount AND user_id = :user_id';

В любом случае считается ли это хорошей практикой? Есть ли другой способ справиться с удалением столбцов с внешними ключами, кроме удаления ключа на некоторое время?

Поскольку вы здесь новичок, отметьте правильный ответ как принятый, чтобы он был закрыт. Я рекомендую вам прочитать эту страницу stackoverflow.com/tour, чтобы получить максимальную отдачу от Stackoverflow.

Krishnadas PC 10.09.2018 10:41

Другие вопросы по теме