2012-03-23 14 views
25

Estoy tratando de convertir mis sentencias MySQL create table a SQLite create table statements. La mayor parte lo he hecho, sin embargo, no sé cómo cambiar el ÍNDICE ÚNICO de MySQL a Sqlites. CREAR ÍNDICE (pensé que eran más o menos lo mismo, corrígeme si me equivoco).Cómo crear correctamente CREATE INDEX con SQLite

así que tengo la siguiente tabla de MySQL (que ha cambiado un poco desde el:

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

Y cambió el índice de acuerdo con http://www.sqlite.org/lang_createindex.html Yo también cambiar algunas otras cosas para ir de MySQL a SQLite pero yo. probado y funcionan Así que este es mi código de 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); 

esto no funciona cuando se quita las líneas índice que hace el trabajo Por lo que yo puedo ver las líneas índice cumplen con esta descripción.. 210, no veo a dónde va mal. Entonces, ¿cómo puedo cambiar las dos líneas

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

para hacer su sintaxis correcta?

Respuesta

41

CREATE UNIQUE INDEX es su propia declaración y no se puede utilizar en una declaración CREATE TABLE.

mover las declaraciones del índice de 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); 
10

que hay que buscar en CREATE TABLE sintaxis, no CREATE INDEX. SQLite aceptará esta forma de restricción ÚNICA en una instrucción CREATE TABLE.

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