2011-08-11 220 views
0

我有一個關於我的數據庫的問題。 我嘗試刪除我的數據庫,但我知道我們需要按特定順序清除表。級聯刪除或添加記錄(插入,更新,刪除)

我想知道如何使用我的數據庫。以何種順序在我的SQL文件中輸入我的表格。我聽說有關ON CASCADE DELETE的事情,我不知道如何添加記錄在我的數據庫(爲了是正確的)

所以,我的問題是:如何刪除,插入,更新我的數據庫中的記錄動態(不是手動PHPMYADMIN)

我知道這是我問了很多信息。

這裏是我的代碼,以幫助:

DROP TABLE IF EXISTS Panier; 
DROP TABLE IF EXISTS Materiel; 
DROP TABLE IF EXISTS Medicament; 
DROP TABLE IF EXISTS ListePatient; 
DROP TABLE IF EXISTS Patient; 
DROP TABLE IF EXISTS Specialiste; 
DROP TABLE IF EXISTS TelPers; 
DROP TABLE IF EXISTS Personne; 
DROP TABLE IF EXISTS Produit; 
DROP TABLE IF EXISTS Telephone; 
DROP TABLE IF EXISTS Adresse; 

CREATE TABLE Adresse(
idAdresse INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
num   INT(5) NOT NULL, 
rue   VARCHAR(30) NOT NULL, 
ville   VARCHAR(15) NOT NULL, 
postal  VARCHAR(6) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Telephone(
idTel   INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
typeTel  VARCHAR(15) NOT NULL, 
ind   INT(3) NOT NULL, 
quartier  INT(3) NOT NULL, 
num   INT(4) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Personne(
idPersonne  INT(100) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
nom    VARCHAR(15) NOT NULL, 
prenom   VARCHAR(15) NOT NULL, 
idTel    INT(100) NOT NULL, 
idAdresse  INT(100) NOT NULL, 
FOREIGN KEY(idAdresse) REFERENCES Adresse(idAdresse), 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) 
)ENGINE=InnoDB; 

CREATE TABLE TelPers(
idPersonne  INT(100)NOT NULL, 
idTel   INT(100)NOT NULL, 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne), 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) 
)ENGINE=InnoDB; 

CREATE TABLE Specialiste(
login   VARCHAR(10) PRIMARY KEY NOT NULL, 
password VARCHAR(10) NOT NULL, 
profession VARCHAR(20) NOT NULL, 
idListeP  INT(5), 
idPanier  INT(5), 
idPersonne INT(100), 
INDEX(idListeP), 
INDEX(idPanier), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) 
)ENGINE=InnoDB; 

CREATE TABLE Patient(
idPatient INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
sexe   CHAR NOT NULL, 
anniv   DATE, 
assurance INT(3) NOT NULL, 
idPersonne INT(100), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) 
)ENGINE=InnoDB; 

CREATE TABLE ListePatient(
idListeP  INT(5) NOT NULL, 
idPatient INT(10)NOT NULL, 
PRIMARY KEY (`idPatient`,`idListeP`), 
FOREIGN KEY(idListeP) REFERENCES Specialiste(idListeP), 
FOREIGN KEY(idPatient) REFERENCES Patient(idPatient) 
)ENGINE=InnoDB; 

CREATE TABLE Produit(
idProduit  INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
nom   VARCHAR(50) NOT NULL, 
descr   VARCHAR(255) NOT NULL, 
prix   DECIMAL(5,2) NOT NULL, 
qte   INT(100) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Medicament(
idMedic   INT(100)NOT NULL PRIMARY KEY AUTO_INCREMENT, 
marque  VARCHAR(10) NOT NULL, 
typeMed  VARCHAR(10) NOT NULL, 
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

CREATE TABLE Materiel(
idMateriel INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
rabais  INT(99) NOT NULL,           
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

CREATE TABLE Panier(
idPanier  INT(5) NOT NULL, 
idProduit  INT(100) NOT NULL, 
PRIMARY KEY (`idPanier`,`idProduit`), 
FOREIGN KEY(idPanier) REFERENCES Specialiste(idPanier), 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

如果你想更精確,我手動刪除我在我的數據庫中的所有記錄,我試圖在數據庫中重新導入這些數據(SQL文件),並拍攝了我錯誤:

-- Dumping data for table `adresse` 
-- 
INSERT INTO `adresse` (`idAdresse` , `num` , `rue` , `ville` , `postal`) 
VALUES (1, 4256, 'de la Vallee', 'Laval', 'H8A1J7') , (2, 121, 'du Coin', 'Laval', 'N6A1B8') , (3, 31, 'rue Galt', 'Montreal', 'A3B6N8') , (4, 5, 'rue du Ranch', 'Laval', 'D1C0V8') ; 

MySQL said: Documentation 
#1062 - Duplicate entry '1' for key 'PRIMARY' 

回答

0

如果你想刪除整個數據庫只是做DROP DATABASE yourDatabaseName;

如果在另一方面,你要確保,如果你刪除從(例如Addresse),然後從引用表(PersonneSpecialiste)行父表中的行也將被刪除,那麼你需要修改外鍵定義

CREATE TABLE Personne(
idPersonne  INT(100) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
nom    VARCHAR(15) NOT NULL, 
prenom   VARCHAR(15) NOT NULL, 
idTel    INT(100) NOT NULL, 
idAdresse  INT(100) NOT NULL, 
FOREIGN KEY(idAdresse) REFERENCES Adresse(idAdresse) ON DELETE CASCADE, 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) ON DELETE CASCADE 
)ENGINE=InnoDB; 

(以及類似的其他表)

更多,請參閱:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

,並非常,非常小心,讓你不刪除比你更想

這裏有一個工作示例:

mysql> USE test; 
Database changed 
mysql> SET foreign_key_checks = 0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP TABLE IF EXISTS Specialiste; 
Query OK, 0 rows affected (0.05 sec) 

mysql> DROP TABLE IF EXISTS Personne; 
Query OK, 0 rows affected (0.02 sec) 

mysql> SET foreign_key_checks = 1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> CREATE TABLE Personne(
    -> idPersonne  INT(100) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    -> nom    VARCHAR(15) NOT NULL 
    ->)ENGINE=InnoDB; 
Query OK, 0 rows affected (0.08 sec) 

mysql> 
mysql> CREATE TABLE Specialiste(
    -> login   VARCHAR(10) PRIMARY KEY NOT NULL, 
    -> idPersonne INT(100), 
    -> FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) ON DELETE CASCADE 
    ->)ENGINE=InnoDB; 
Query OK, 0 rows affected (0.07 sec) 

mysql> 
mysql> SHOW TABLES; 
+----------------+ 
| Tables_in_test | 
+----------------+ 
| personne  | 
| specialiste | 
+----------------+ 
2 rows in set (0.00 sec) 

mysql> 
mysql> INSERT INTO personne VALUES (null,'personne1'),(null,'personne2'); 
Query OK, 2 rows affected (0.02 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> 
mysql> INSERT INTO Specialiste VALUES ('login1',1),('login2',2); 
Query OK, 2 rows affected (0.03 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> 
mysql> SELECT * FROM personne; 
+------------+-----------+ 
| idPersonne | nom  | 
+------------+-----------+ 
|   1 | personne1 | 
|   2 | personne2 | 
+------------+-----------+ 
2 rows in set (0.00 sec) 

mysql> SELECT * FROM specialiste; 
+--------+------------+ 
| login | idPersonne | 
+--------+------------+ 
| login1 |   1 | 
| login2 |   2 | 
+--------+------------+ 
2 rows in set (0.01 sec) 

mysql> 
mysql> DELETE FROM personne WHERE idPersonne = 1; 
Query OK, 1 row affected (0.02 sec) 

mysql> 
mysql> SELECT * FROM personne; 
+------------+-----------+ 
| idPersonne | nom  | 
+------------+-----------+ 
|   2 | personne2 | 
+------------+-----------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM specialiste; 
+--------+------------+ 
| login | idPersonne | 
+--------+------------+ 
| login2 |   2 | 
+--------+------------+ 
1 row in set (0.00 sec) 
+0

,如果我想只刪除一條記錄(誰與外鍵鏈接到其他的相關信息)是什麼? – Hulk

+0

@Hulk:我更新了我的答案 – Mchl

+0

ok讓我測試.. – Hulk

0

如果你想刪除整個數據庫:

DROP DATABASE databasename 

注意的是,進入控制檯這一點,並按下回車鍵將立即刪除整個數據庫,但不恢復

+0

如果我只想刪除一條記錄(誰與其他信息的外鍵鏈接),那麼怎麼辦? – Hulk

+0

?現在你只想刪除記錄?你確定你知道你在做什麼嗎? – hoppa

+0

...是的,我願意。我將重新制定我的問題..對不起 – Hulk

0

我我不確定你的意思是通過動態更新。
您必須編寫代碼根據您的業務規則更新,插入和刪除行。

它有助於使圖紙列出的依賴確保你沒有循環依賴。
如果您繪製具有外鍵傳出的表位於頂部,而那些傳入相關性位於最下方的表,則必須編寫自上而下遍歷此樹的代碼。

以下是數據庫的外觀。

Level 0 
+---------+ +-------------+ +----------+ +------------+ +--------------+ 
| TelPers | | Panier  | | Materiel | | Medicament | | ListePatient | 
+---------+ +-------------+ +----------+ +------------+ +--------------+ 
Level 1 
+-----------+ +---------+ +----------+ +-------------+ +---------+ 
| Telephone | | Adresse | | Produit | | Specialiste | | Patient | 
+-----------+ +---------+ +----------+ +-------------+ +---------+ 

注意,有從0級僅依賴DOWNTO水平1。所以沒有必要繪製表之間的關係,只要確保你:
插入:不要在1級,然後所有插入上升到0級。
刪除:刪除level0中的所有項目,然後下降到level1。
更新:這隻適用於更改關鍵字段的更新。先執行0級,然後再執行1級。

因爲您正在使用支持引用完整性(可能是InnoDB)的引擎,所以您也有事務。做你插入像這樣:

START TRANSACTION; 
INSERT INTO Patient VALUES (.....); 
SELECT LAST_INSERT_ID() INTO @patient_id; 
INSERT INTO Specialiste VALUES (...); 
SELECT LAST_INSERT_ID() INTO @Specialiste_id; 
INSERT INTO ListePatient VALUES (@Specialiste_id, @patient_id); 
COMMIT; 

因爲你使用的是交易中的整體插入鏈將成功或永遠不會發生,你不能有部分數據。
您可以將這些東西放入MySQL中的存儲過程中,並用適當的參數調用這些參數以在數據庫上執行操作。

鏈接:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
http://dev.mysql.com/doc/refman/5.0/en/commit.html
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
http://dev.mysql.com/doc/refman/5.1/en/stored-routines.html