用外键删除表

时间:2018-09-10 07:07:18

标签: php mysql

我正在尝试删除带有外键的列。我坐在这上面已经知道了一段时间了,感觉就像我正在监督某些事情,并且遮篷必须很明显,但我只是不明白。 我从loggs中得到的错误是:

  

PHP致命错误:无法声明类User,因为名称为   已经在使用的user_id是来自的标识符的外键   班级用户。

我使用的数据库是InnoDB。我已经尝试过了:

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

但这没什么作用,loggs中没有错误。

我很抱歉,这很明显,我是学生,这是我第三周。 ¯_(ツ)_ /¯

<?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>

我的模型中班级组的相关部分如下:

 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;

  }

2 个答案:

答案 0 :(得分:0)

如果您的查询在MySql控制台中失败,请选中此选项。如果失败,则表示约束名称可能不正确。如果是这种情况,请尝试以下代码。 必须使用外来键约束名而不是列名来删除外键。

要获取约束名称,您可以使用

SHOW CREATE TABLE Group

ALTER TABLE `Group` DROP FOREIGN KEY `your_constraint_name_here`

更多信息可以在

找到

MySQL Removing Some Foreign keys

答案 1 :(得分:0)

感谢您的帮助。我在删除外键的代码中出现错误,它可以这样工作:

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

此外,在delete函数中,它还必须是AND而不是逗号,例如:

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

无论如何,这被认为是好的做法吗?还有另一种方法来处理带有外键的删除列,然后暂时删除键吗?