我有两张表要填写,“msrun”和“feature”。'feature' 有一个指向 'msrun' 表的 'msrun_name' 列的外键。在表格中插入工作正常。但是,当我尝试从“功能”表中删除时,出现以下错误:
pysqlite2.dbapi2.OperationalError: foreign key mismatch
从SQLite手册中的外键规则:
- The parent table does not exist, or
- The parent key columns named in the foreign key constraint do not exist, or
- The parent key columns named in the foreign key constraint are not the primary key of the parent table and are not subject to a unique constraint using collating sequence specified in the CREATE TABLE, or
- The child table references the primary key of the parent without specifying the primary key columns and the number of primary key columns in the parent do not match the number of child key columns.
我看不到我违反了什么。我的创建表如下所示:
DROP TABLE IF EXISTS `msrun`;
-- -----------------------------------------------------
-- Table `msrun`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `msrun` (
`msrun_name` VARCHAR(40) PRIMARY KEY NOT NULL ,
`description` VARCHAR(500) NOT NULL );
DROP TABLE IF EXISTS `feature`;
-- -----------------------------------------------------
-- Table `feature`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feature` (
`feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
`intensity` DOUBLE NOT NULL ,
`overallquality` DOUBLE NOT NULL ,
`charge` INT NOT NULL ,
`content` VARCHAR(45) NOT NULL ,
`msrun_msrun_name` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_feature_msrun1`
FOREIGN KEY (`msrun_msrun_name` )
REFERENCES `msrun` (`msrun_name` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE UNIQUE INDEX `id_UNIQUE` ON `feature` (`feature_id` ASC);
CREATE INDEX `fk_feature_msrun1` ON `feature` (`msrun_msrun_name` ASC);
据我所知,父表存在,外键指向正确的父键,父键是主键,外键指定主键列。
产生错误的脚本:
from pysqlite2 import dbapi2 as sqlite
import parseFeatureXML
connection = sqlite.connect('example.db')
cursor = connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
inputValues = ('example', 'description')
cursor.execute("INSERT INTO `msrun` VALUES(?, ?)", inputValues)
featureXML = parseFeatureXML.Reader('../example_scripts/example_files/input/featureXML_example.featureXML')
for feature in featureXML.getSimpleFeatureInfo():
inputValues = (featureXML['id'], featureXML['intensity'],
featureXML['overallquality'], featureXML['charge'],
featureXML['content'], 'example')
# insert the values into msrun using ? for sql injection safety
cursor.execute("INSERT INTO `feature` VALUES(?,?,?,?,?,?)", inputValues)
connection.commit()
for feature in featureXML.getSimpleFeatureInfo():
cursor.execute("DELETE FROM `feature` WHERE feature_id = ?", (str(featureXML['id']),))
编辑:
这些是具有链接到功能的外键的表。他们还没有被填满:
DROP TABLE IF EXISTS `convexhull`;
-- -----------------------------------------------------
-- Table `convexhull`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `convexhull` (
`convexhull_id` INT PRIMARY KEY NOT NULL ,
`mz` DOUBLE NOT NULL ,
`rt` DOUBLE NOT NULL ,
`feature_feature_id` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_convexhull_feature`
FOREIGN KEY (`feature_feature_id` )
REFERENCES `feature` (`feature_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_convexhull_feature` ON `convexhull` (`feature_feature_id` ASC);
DROP TABLE IF EXISTS `position`;
-- -----------------------------------------------------
-- Table `position`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `position` (
`position_id` INT PRIMARY KEY NOT NULL ,
`dim0` INT NOT NULL ,
`dim1` INT NOT NULL ,
`feature_feature_id` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_position_feature1`
FOREIGN KEY (`feature_feature_id` )
REFERENCES `feature` (`feature_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_position_feature1` ON `position` (`feature_feature_id` ASC);
DROP TABLE IF EXISTS `userParam_names`;
-- -----------------------------------------------------
-- Table `userParam_names`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `userParam_names` (
`userParam_id` INT PRIMARY KEY NOT NULL ,
`Name` VARCHAR(45) NOT NULL );
DROP TABLE IF EXISTS `feature_has_userParam_names`;
-- -----------------------------------------------------
-- Table IF EXISTS `feature_has_userParam_names`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feature_has_userParam_names` (
`feature_feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
`userParam_names_userParam_id` INT NOT NULL ,
CONSTRAINT `fk_feature_has_userParam_names_feature1`
FOREIGN KEY (`feature_feature_id` )
REFERENCES `feature` (`feature_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_feature_has_userParam_names_userParam_names1`
FOREIGN KEY (`userParam_names_userParam_id` )
REFERENCES `userParam_names` (`userParam_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_feature_has_userParam_names_userParam_names1` ON `feature_has_userParam_names` (`userParam_names_userParam_id` ASC);
CREATE INDEX `fk_feature_has_userParam_names_feature1` ON `feature_has_userParam_names` (`feature_feature_id` ASC);
DROP TABLE IF EXISTS `userParam_value`;
-- -----------------------------------------------------
-- Table IF EXISTS `userParam_value`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `userParam_value` (
`iduserParam_value` INT PRIMARY KEY NOT NULL ,
`userParam_name` VARCHAR(45) NOT NULL ,
`value` VARCHAR(45) NOT NULL );
DROP TABLE IF EXISTS `feature_has_userParam_names_has_userParam_value`;
-- -----------------------------------------------------
-- Table `feature_has_userParam_names_has_userParam_value`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feature_has_userParam_names_has_userParam_value` (
`feature_has_userParam_names_feature_feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
`feature_has_userParam_names_userParam_names_userParam_id` INT NOT NULL ,
`userParam_value_iduserParam_value` INT NOT NULL ,
CONSTRAINT `fk_feature_has_userParam_names_has_userParam_value_feature_ha1`
FOREIGN KEY (`feature_has_userParam_names_feature_feature_id` , `feature_has_userParam_names_userParam_names_userParam_id` )
REFERENCES `feature_has_userParam_names` (`feature_feature_id` , `userParam_names_userParam_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_feature_has_userParam_names_has_userParam_value_userParam_1`
FOREIGN KEY (`userParam_value_iduserParam_value` )
REFERENCES `userParam_value` (`iduserParam_value` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_feature_has_userParam_names_has_userParam_value_userParam_1` ON `feature_has_userParam_names_has_userParam_value` (`userParam_value_iduserParam_value` ASC);
CREATE INDEX `fk_feature_has_userParam_names_has_userParam_value_feature_ha1` ON `feature_has_userParam_names_has_userParam_value` (`feature_has_userParam_names_feature_feature_id` ASC, `feature_has_userParam_names_userParam_names_userParam_id` ASC);
当我从 SQLite 管理器执行删除语句时,它确实有效。
编辑2:
完整追溯:
Traceback (most recent call last):
File "/homes/ndeklein/workspace/MS/Trunk/PyMS_dev/database/test.py", line 25, in <module>
cursor.execute("DELETE FROM `feature` WHERE feature_id = 'f_13020522388175237334'")
pysqlite2.dbapi2.OperationalError: foreign key mismatch
正在做
DELETE FROM `feature` WHERE feature_id = 'f_13020522388175237334'
在 SQLite 管理器中工作。
编辑 3
包括所有表格:
--------------------------------------------------------
-- pyMS database. Drops all tables before it makes them, should be changed before release
--------------------------------------------------------
DROP TABLE IF EXISTS `msrun`;
-- -----------------------------------------------------
-- Table `msrun`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `msrun` (
`msrun_name` VARCHAR(40) PRIMARY KEY NOT NULL ,
`description` VARCHAR(500) NOT NULL );
DROP TABLE IF EXISTS `feature`;
-- -----------------------------------------------------
-- Table `feature`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feature` (
`feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
`intensity` DOUBLE NOT NULL ,
`overallquality` DOUBLE NOT NULL ,
`charge` INT NOT NULL ,
`content` VARCHAR(45) NOT NULL ,
`msrun_msrun_name` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_feature_msrun1`
FOREIGN KEY (`msrun_msrun_name` )
REFERENCES `msrun` (`msrun_name` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE UNIQUE INDEX `id_UNIQUE` ON `feature` (`feature_id` ASC);
CREATE INDEX `fk_feature_msrun1` ON `feature` (`msrun_msrun_name` ASC);
DROP TABLE IF EXISTS `convexhull`;
-- -----------------------------------------------------
-- Table `convexhull`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `convexhull` (
`convexhull_id` INT PRIMARY KEY NOT NULL ,
`mz` DOUBLE NOT NULL ,
`rt` DOUBLE NOT NULL ,
`feature_feature_id` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_convexhull_feature`
FOREIGN KEY (`feature_feature_id` )
REFERENCES `feature` (`feature_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_convexhull_feature` ON `convexhull` (`feature_feature_id` ASC);
DROP TABLE IF EXISTS `position`;
-- -----------------------------------------------------
-- Table `position`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `position` (
`position_id` INT PRIMARY KEY NOT NULL ,
`dim0` INT NOT NULL ,
`dim1` INT NOT NULL ,
`feature_feature_id` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_position_feature1`
FOREIGN KEY (`feature_feature_id` )
REFERENCES `feature` (`feature_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_position_feature1` ON `position` (`feature_feature_id` ASC);
DROP TABLE IF EXISTS `userParam_names`;
-- -----------------------------------------------------
-- Table `userParam_names`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `userParam_names` (
`userParam_id` INT PRIMARY KEY NOT NULL ,
`Name` VARCHAR(45) NOT NULL );
DROP TABLE IF EXISTS `feature_has_userParam_names`;
-- -----------------------------------------------------
-- Table IF EXISTS `feature_has_userParam_names`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feature_has_userParam_names` (
`feature_feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
`userParam_names_userParam_id` INT NOT NULL ,
CONSTRAINT `fk_feature_has_userParam_names_feature1`
FOREIGN KEY (`feature_feature_id` )
REFERENCES `feature` (`feature_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_feature_has_userParam_names_userParam_names1`
FOREIGN KEY (`userParam_names_userParam_id` )
REFERENCES `userParam_names` (`userParam_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_feature_has_userParam_names_userParam_names1` ON `feature_has_userParam_names` (`userParam_names_userParam_id` ASC);
CREATE INDEX `fk_feature_has_userParam_names_feature1` ON `feature_has_userParam_names` (`feature_feature_id` ASC);
DROP TABLE IF EXISTS `userParam_value`;
-- -----------------------------------------------------
-- Table IF EXISTS `userParam_value`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `userParam_value` (
`iduserParam_value` INT PRIMARY KEY NOT NULL ,
`userParam_name` VARCHAR(45) NOT NULL ,
`value` VARCHAR(45) NOT NULL );
DROP TABLE IF EXISTS `feature_has_userParam_names_has_userParam_value`;
-- -----------------------------------------------------
-- Table `feature_has_userParam_names_has_userParam_value`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feature_has_userParam_names_has_userParam_value` (
`feature_has_userParam_names_feature_feature_id` VARCHAR(40) PRIMARY KEY NOT NULL ,
`feature_has_userParam_names_userParam_names_userParam_id` INT NOT NULL ,
`userParam_value_iduserParam_value` INT NOT NULL ,
CONSTRAINT `fk_feature_has_userParam_names_has_userParam_value_feature_ha1`
FOREIGN KEY (`feature_has_userParam_names_feature_feature_id` , `feature_has_userParam_names_userParam_names_userParam_id` )
REFERENCES `feature_has_userParam_names` (`feature_feature_id` , `userParam_names_userParam_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_feature_has_userParam_names_has_userParam_value_userParam_1`
FOREIGN KEY (`userParam_value_iduserParam_value` )
REFERENCES `userParam_value` (`iduserParam_value` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_feature_has_userParam_names_has_userParam_value_userParam_1` ON `feature_has_userParam_names_has_userParam_value` (`userParam_value_iduserParam_value` ASC);
CREATE INDEX `fk_feature_has_userParam_names_has_userParam_value_feature_ha1` ON `feature_has_userParam_names_has_userParam_value` (`feature_has_userParam_names_feature_feature_id` ASC, `feature_has_userParam_names_userParam_names_userParam_id` ASC);
DROP TABLE IF EXISTS `precursor`;
-- -----------------------------------------------------
-- Table `precursor`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `precursor` (
`precursor_id` INT PRIMARY KEY NOT NULL ,
`ion_mz` DOUBLE NOT NULL ,
`charge_state` INT NOT NULL ,
`peak_intensity` DOUBLE NOT NULL );
DROP TABLE IF EXISTS `spectrum`;
-- -----------------------------------------------------
-- Table `spectrum`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `spectrum` (
`spectrum_index` INT PRIMARY KEY NOT NULL ,
`ms_level` INT NOT NULL ,
`base_peak_mz` DOUBLE NOT NULL ,
`base_peak_intensity` DOUBLE NOT NULL ,
`total_ion_current` DOUBLE NOT NULL ,
`lowest_observes_mz` DOUBLE NOT NULL ,
`highest_observed_mz` DOUBLE NOT NULL ,
`scan_start_time` DOUBLE NOT NULL ,
`ion_injection_time` DOUBLE NOT NULL ,
`msrun_msrun_name` VARCHAR(40) NOT NULL ,
`precursor_precursor_id` INT NOT NULL ,
CONSTRAINT `fk_spectrum_msrun1`
FOREIGN KEY (`msrun_msrun_name` )
REFERENCES `msrun` (`msrun_name` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_spectrum_precursor1`
FOREIGN KEY (`precursor_precursor_id` )
REFERENCES `precursor` (`precursor_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_spectrum_msrun1` ON `spectrum` (`msrun_msrun_name` ASC);
CREATE INDEX `fk_spectrum_precursor1` ON `spectrum` (`precursor_precursor_id` ASC);
DROP TABLE IF EXISTS `spectrum_has_feature`;
-- -----------------------------------------------------
-- Table `spectrum_has_feature`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `spectrum_has_feature` (
`spectrum_spectrum_index` INT PRIMARY KEY NOT NULL ,
`spectrum_msrun_msrun_name` VARCHAR(40) NOT NULL ,
`spectrum_precursor_precursor_id` INT NOT NULL ,
`feature_feature_id` VARCHAR(40) NOT NULL ,
`feature_msrun_msrun_name` VARCHAR(40) NOT NULL ,
CONSTRAINT `fk_spectrum_has_feature_spectrum1`
FOREIGN KEY (`spectrum_spectrum_index` , `spectrum_msrun_msrun_name` , `spectrum_precursor_precursor_id` )
REFERENCES `spectrum` (`spectrum_index` , `msrun_msrun_msrun_name` , `precursor_precursor_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_spectrum_has_feature_feature1`
FOREIGN KEY (`feature_feature_id` , `feature_msrun_msrun_name` )
REFERENCES `feature` (`feature_id` , `msrun_msrun_msrun_name` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE INDEX `fk_spectrum_has_feature_feature1` ON `spectrum_has_feature` (`feature_feature_id` ASC, `feature_msrun_msrun_name` ASC);
CREATE INDEX `fk_spectrum_has_feature_spectrum1` ON `spectrum_has_feature` (`spectrum_spectrum_index` ASC, `spectrum_msrun_msrun_name` ASC, `spectrum_precursor_precursor_id` ASC);