2016-05-09 28 views
1

SQLコードにいくつかの問題があります...削除ボタンを作成しました。person_idが削除されると、テーブルのアドレスとcvから値を削除する必要があります。それを削除するのは、アドレスとcvからではなく、personからの値だけを削除することです。 はい私はこのコードで知っているのですが、DELETE ACTIONはNO ACTIONですが、ON DELETE CASCADEをSQLスクリプトに追加しました!他のテーブルの値を削除しない削除ボタン

マイSQL:

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

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_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(); 
?> 
+0

制約が実際に「取られた」ことを確認し、テーブルが適切に索引付けされていることを確認します。 – LSerni

+0

どういう意味ですか?「制約が実際に「取られた」ことを確認し、テーブルが適切にインデックスされていることを確認してください。申し訳ありませんが、PHP/Mysqlの新機能です – GLRotterdam

+0

テーブル定義とインデックスを読み返してください。私は外部キー制約(コマンドライン?GUI?WebGUI?...)をどのように変更したかわからないので、制約変更が実際には失敗*してエラーメッセージが発行/通知/通知されなかった可能性があります。あなたはまだ「行動」していません。 – LSerni

答えて

0

FOREIGN KEYの定義がなくても、エラーがどこにあるかはわかりません。私はあなたのセットアップを複製しようとした、これが動作していることを保証することができます。

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

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET NAMES utf8mb4 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@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 [email protected]_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; 

は、データがCVからを削除されていることを確認します - ロッシさん、ID

SELECT * FROM cv; 

... 1つのレコードのみを返します。 Id 2が消滅した。

+0

私のコードは大丈夫ですか?それはどうやってテーブルアドレスとcvからの情報も削除されません...何かエラーがないのでちょっと変です。私が望むのは、人物、住所、CVを削除できることだけです。 3つのテーブルすべてに関係があります。 – GLRotterdam

0

私は、テーブル作成コードでFOREIGN_KEY_CHECKSの編集を見ることができます。リセットするために古い値をバックアップしていますが、削除を実行しているときにFOREIGN_KEY_CHECKSの値が1であることを確認していますか?

+0

私はあなたが何を意味するかを見ています...私は全く新しいデータベースを作成しているので、私は正しければ古い外部キーはありません。 2行を削除してうまくいけばどうしますか? – GLRotterdam

関連する問題