2011-08-11 162 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