在级联DELETE或ADD RECORD(INSERT,UPDATE,DELETE)

时间:2011-08-11 12:10:37

标签: mysql

我对我的数据库有疑问。 我尝试删除我的数据库,但我知道我们需要按特定顺序清除表格。

我想知道如何使用我的数据库。以哪种顺序在我的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 FILE)并且它向我发出错误:

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

3 个答案:

答案 0 :(得分:0)

如果要删除整个数据库,请执行DROP DATABASE yourDatabaseName;

另一方面,如果要确保,如果从父表中删除一行(例如Addresse),则引用表(Personne,{{1} })也被删除,然后你需要修改你的外键定义

Specialiste

(和其他表类似)

在此处查看更多内容:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

并且非常非常小心,因此您不会删除超出您想要的内容

这是一个有效的例子:

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;

答案 1 :(得分:0)

如果要删除整个数据库:

DROP DATABASE databasename

注意,将其输入您的控制台并按Enter键将立即删除整个数据库而无需恢复

答案 2 :(得分:0)

我不确定你动态更新是什么意思 您必须编写代码,根据您的业务规则更新,插入和删除行。

有助于制作列出依赖关系的图纸,确保您没有电子邮件依赖关系 如果您将具有外键的表格绘制在顶部,而在底部绘制具有传入依赖项的表格,则必须编写从上到下遍历此树的代码。

以下是数据库的外观。

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

请注意,只有0级downto级别1存在依赖关系。因此无需绘制表格之间的关系,只需确保: 插入:在level1中执行所有插入操作,然后再升级到第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