【问题标题】:Delete button not deleting values from other tables删除按钮不删除其他表中的值
【发布时间】:2016-05-09 13:19:55
【问题描述】:

我的 SQL 代码遇到了一些问题...我创建了一个删除按钮,因此当 person_id 被删除时,它还应该从表地址和 cv 中删除值,但是当我单击删除时,它只会删除人员中的值而不是来自地址和简历。 是的,我知道在这段代码中 ON DELETE ACTION 是 NO ACTION,但是我在 sql 脚本中添加了 ON DELETE CASCADE!

我的 SQL:

-- MySQL Script generated by MySQL Workbench
-- 05/09/16 15:12:48
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema persons
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema persons
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `persons` DEFAULT CHARACTER SET utf8 ;
USE `persons` ;

-- -----------------------------------------------------
-- Table `persons`.`address`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `persons`.`address` (
`address_id` INT(11) NOT NULL AUTO_INCREMENT,
`address_street` VARCHAR(45) NULL,
`address_housenumber` VARCHAR(4) NULL,
`address_zipcode` VARCHAR(6) NULL,
`address_city` VARCHAR(45) NULL,
`address_state` VARCHAR(45) NULL,
 PRIMARY KEY (`address_id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `persons`.`cv`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `persons`.`cv` (
`cv_id` INT NOT NULL AUTO_INCREMENT,
`cv_name` VARCHAR(255) NULL,
`cv_path` VARCHAR(255) NULL,
`cv_type` VARCHAR(255) NULL,
 PRIMARY KEY (`cv_id`))
ENGINE = InnoDB;


 -- -----------------------------------------------------
 -- Table `persons`.`person`
 -- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `persons`.`person` (
`person_id` INT(11) NOT NULL AUTO_INCREMENT,
`person_firstname` VARCHAR(45) NULL,
`person_lastname` VARCHAR(45) NULL,
`person_email` VARCHAR(45) NULL,
`person_phonenumber` INT(10) NULL,
`person_cv` INT(11) NULL,
`person_address` INT(11) NULL,
 PRIMARY KEY (`person_id`),
 INDEX `address_id_idx` (`person_address` ASC),
 INDEX `cv_id_idx` (`person_cv` ASC),
 CONSTRAINT `address_id`
 FOREIGN KEY (`person_address`)
 REFERENCES `persons`.`address` (`address_id`)
 ON DELETE NO ACTION
 ON UPDATE NO ACTION,
 CONSTRAINT `cv_id`
 FOREIGN KEY (`person_cv`)
 REFERENCES `persons`.`cv` (`cv_id`)
 ON DELETE NO ACTION
 ON UPDATE NO ACTION)
 ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

我的 Delete.php:我添加了要删除的 address_id 和 cv_id 仍然无法正常工作!

<?php
$servername = "localhost";
$username = "root";
$password = "usbw";
$dbname = "persons";

// CREATE A CONNECTION WITH THE DATABASE
// CONNECTIE MAKEN MET DATABASE
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// GET ID FROM person_id
// PAK ID VAN person_id 
$person_id = (isset($_GET['person_id']) ? $_GET['person_id'] : null);

// CREATE PREPARE STATMENT FOR DELETING RECORDS FROM person_id
// MAAK EEN STATEMENT OM WAARDES TE VERWIJDEREN VAN person_id
$stmt = $conn->prepare('DELETE FROM `person` WHERE person_id = ?'); 
$stmt->bind_param('s', $person_id);                                         

// EXECUTE STATEMENT AND IF RESULT IS FALSE SHOW ERROR
// VOER STATEMENT UIT EN ALS VALS IS GEEF ERROR AAN
$result = $stmt->execute();    
if ($result === FALSE) {
    die("Error: " . $stmt->error);
}

$address_id = (isset($_GET['address_id']) ? $_GET['address_id'] : null);

$stmt = $conn->prepare('DELETE FROM `address` WHERE address_id = ?'); 
$stmt->bind_param('s', $address_id);                                         

// EXECUTE STATEMENT AND IF RESULT IS FALSE SHOW ERROR
// VOER STATEMENT UIT EN ALS VALS IS GEEF ERROR AAN
$result = $stmt->execute();    
if ($result === FALSE) {
    die("Error: " . $stmt->error);
}

$cv_id = (isset($_GET['cv_id']) ? $_GET['cv_id'] : null);

$stmt = $conn->prepare('DELETE FROM `cv` WHERE cv_id = ?'); 
$stmt->bind_param('s', $cv_id);                                         

// EXECUTE STATEMENT AND IF RESULT IS FALSE SHOW ERROR
// VOER STATEMENT UIT EN ALS VALS IS GEEF ERROR AAN
$result = $stmt->execute();    
if ($result === FALSE) {
    die("Error: " . $stmt->error);
}
// AFTER CLICKING DELETE GO TO LINK
// NA HET DRUKKEN VAN DELETE GA NAAR LINK
header("Location: http://localhost:8080/Website/admin.php");

// CLOSE CONNECTION AND STATEMENT
// SLUIT CONNECTIE EN STATEMENT
$stmt->close();
$conn->close();
?>

【问题讨论】:

  • 验证约束确实“被接受”,并且表被正确索引。
  • 您所说的“验证约束确实已被“采用”,并且表已正确编入索引是什么意思。对不起,我是 PHP/Mysql 的新手
  • 读回表定义和索引。我不知道您如何更改外键约束(命令行?GUI?WebGUI?...),因此您的约束更改实际上可能 failed 并且没有发出错误消息/已发送/已通知,而您仍在使用NO ACTION
  • 我将 phpmyadmin 中的 NO ACTION 更改为 CASCADE,所以这不是问题。我还添加了我的 delete.php。
  • 您可能已将“NO ACTION”设置为“CASCADE”,但它真的有效吗?检查stackoverflow.com/questions/13134913/… 并确保您的delete cascade 规则在那里。

标签: php mysql


【解决方案1】:

如果没有 FOREIGN KEY 定义,就很难看出错误可能出在哪里。我已尝试复制您的设置,并且可以保证这是有效的:

-- --------------------------------------------------------
-- Versione server:              5.5.49-0ubuntu0.14.04.1 - (Ubuntu)
-- S.O. server:                  debian-linux-gnu
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

CREATE TABLE IF NOT EXISTS `cv` (
  `person_id` int(11) DEFAULT NULL,
  `cv_text` varchar(32) DEFAULT NULL,
  KEY `person_id` (`person_id`),
  CONSTRAINT `FK_cv_persons` FOREIGN KEY (`person_id`) REFERENCES `persons` (`person_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `persons` (
  `person_id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

-- 现在我插入一些数据:

INSERT INTO `persons` (`person_id`) VALUES
    (1),(2);

-- 以及链接的 cvs:

INSERT INTO `cv` (`person_id`, `cv_text`) VALUES
    (1, 'Rossi'),(2, 'Verdi'),(2, 'Verdini');

-- 确认数据存在:

SELECT * FROM cv;

-- 删除个人的一些数据

DELETE FROM persons WHERE person_id = 2;

-- 验证数据是否已从简历中删除

SELECT * FROM cv;

...只返回一条记录 - Rossi 的,id 1。id 2 已消失。

【讨论】:

  • 所以我的代码没问题?它是怎么来的,它没有从表地址和简历中删除任何信息......这很奇怪,因为我没有收到任何错误。我想要的只是能够删除人员、地址和简历。当然这三个表都有关系。
【解决方案2】:

我可以在您的表创建代码中看到 FOREIGN_KEY_CHECKS 的一些编辑。我看到您备份了旧值以重置它,但您确定在执行删除时 FOREIGN_KEY_CHECKS 值为 1?

【讨论】:

  • 我明白你的意思......如果我是对的,没有旧的外键,因为我正在创建一个全新的数据库。如果我删除这两行并尝试它会起作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多