web-dev-qa-db-ja.com

SQLiteでCREATE INDEXを正しく行う方法

MySQL create tableステートメントをSQLite create tableステートメントに変換しようとしています。私はそれのほとんどをやったが、MySQLのUNIQUE INDEXをSqlites CREATE INDEXに変更する方法がわからない(これらはほぼ同じだと思ったので、間違っていたら修正してください)。

だから私は次のMySQLテーブルを持っています(それはから少し変更されました:

-- -----------------------------------------------------
-- Table `pyMS`.`feature`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `pyMS`.`feature` (
  `feature_id` VARCHAR(40) NOT NULL ,
  `intensity` DOUBLE NOT NULL ,
  `overallquality` DOUBLE NOT NULL ,
  `quality` DOUBLE NOT NULL ,
  `charge` INT NOT NULL ,
  `content` VARCHAR(45) NOT NULL ,
  `msrun_msrun_id` INT NOT NULL ,
  PRIMARY KEY (`feature_id`, `msrun_msrun_id`) ,
  UNIQUE INDEX `id_UNIQUE` (`feature_id` ASC) ,
  INDEX `fk_feature_msrun1` (`msrun_msrun_id` ASC) ,
  CONSTRAINT `fk_feature_msrun1`
    FOREIGN KEY (`msrun_msrun_id` )
    REFERENCES `pyMS`.`msrun` (`msrun_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

そして、 http://www.sqlite.org/lang_createindex.html に従ってインデックスを変更しました。また、MySQLからSQLiteに移行するために他のいくつかのことを変更しましたが、テストを行ったところ機能します。だからこれは私のSQLiteコードです:

-- -----------------------------------------------------
-- Table `feature`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `feature` (
  `feature_id` VARCHAR(40) NOT NULL ,
  `intensity` DOUBLE NOT NULL ,
  `overallquality` DOUBLE NOT NULL ,
  `quality` DOUBLE NOT NULL ,
  `charge` INT NOT NULL ,
  `content` VARCHAR(45) NOT NULL ,
  `msrun_msrun_id` INT NOT NULL ,
  CREATE UNIQUE INDEX `id_UNIQUE` ON `feature` (`feature_id` ASC) ,
  CREATE INDEX `fk_feature_msrun1` ON `msrun` (`msrun_msrun_id` ASC) ,
  CONSTRAINT `fk_feature_msrun1`
    FOREIGN KEY (`msrun_msrun_id` )
    REFERENCES `msrun` (`msrun_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

これは動作しません。 INDEX行を削除すると機能します。 INDEX行がこの説明に準拠していることがわかる限り、 http://www.sqlite.org/lang_createindex.html で、どこに問題があるのか​​わかりません。どうすれば2行を変更できますか

CREATE UNIQUE INDEX `id_UNIQUE` ON `feature` (`feature_id` ASC) ,
CREATE INDEX `fk_feature_msrun1` ON `msrun` (`msrun_msrun_id` ASC) ,

構文を正しくするには?

27
Niek de Klein

CREATE UNIQUE INDEXは独自のステートメントであり、CREATE TABLEステートメント内では使用できません。

インデックスステートメントをCREATE TABLEから移動します。

CREATE  TABLE IF NOT EXISTS `feature` (
  `feature_id` VARCHAR(40) NOT NULL ,
  `intensity` DOUBLE NOT NULL ,
  `overallquality` DOUBLE NOT NULL ,
  `quality` DOUBLE NOT NULL ,
  `charge` INT NOT NULL ,
  `content` VARCHAR(45) NOT NULL ,
  `msrun_msrun_id` INT NOT NULL,
  CONSTRAINT `fk_feature_msrun1`
    FOREIGN KEY (`msrun_msrun_id` )
    REFERENCES `msrun` (`msrun_id` )
    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_id` ASC);

CREATE INDEXではなく、 CREATE TABLE 構文を確認する必要があります。 SQLiteは、CREATE TABLEステートメントでこの形式のUNIQUE制約を受け入れます。

CREATE  TABLE IF NOT EXISTS `feature` (
...
  CONSTRAINT `id_UNIQUE` UNIQUE (`feature_id`),
...
);