-3

MySQL Workbenchを使用していくつかのテーブルを作成しましたが、外部キーに問題があります。以下のコードをエクスポートするとエラーが発生しますが、外部キーを使用してエクスポートしないとエラーは発生しません。コードを確認してください。

SQLコード:

DROP TABLE IF EXISTS `mydb`.`users` ;
CREATE  TABLE IF NOT EXISTS `mydb`.`users` (
`uuserid` INT NOT NULL AUTO_INCREMENT ,
`ufname` VARCHAR(25) NULL ,
`ulname` VARCHAR(25) NULL ,
`uuname` VARCHAR(45) NULL ,
`upass` CHAR(64) NOT NULL ,
`uemail` VARCHAR(254) NOT NULL ,
`urole` INT NULL DEFAULT 0 ,
PRIMARY KEY (`uuserid`) )
ENGINE = InnoDB;


DROP TABLE IF EXISTS `mydb`.`photos` ;
CREATE  TABLE IF NOT EXISTS `mydb`.`photos` (
`pphotoid` INT NOT NULL ,
`pname` VARCHAR(4) NULL ,
`plat` FLOAT(10,6) NULL ,
`plng` FLOAT(10,6) NULL ,
`pflag` DECIMAL(10,0) NULL DEFAULT 0 ,
`pext` VARCHAR(4) NULL ,
`plike` DECIMAL(10,0) NULL DEFAULT 0 ,
PRIMARY KEY (`pphotoid`) ,
CONSTRAINT `uuserid`
FOREIGN KEY ()
REFERENCES `mydb`.`users` ()
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

エラー:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') REFERENCES `mydb`.`users` () ON DELETE NO ACTION ON UPDAT' at line 21

私のデータベースにはさらに多くのテーブルがありますが、このコードも壊れています。phpmyadminを使用してこれを挿入しようとしました。

4

3 に答える 3

3

ここでは、列名を指定する必要があります

FOREIGN KEY (present_table_column_name)

参考文献mydbusers(foriegn_key_column_name)

于 2013-03-05T21:12:22.340 に答える
1

このスクリプトを実行してみてください。スクリプトを使用してこれを作成し、SQLFiddleで実行したので、機能することがわかります。外部キーを追加するには、適切なフィールドが必要です。この例では、テーブルにuuserid列を追加しました。photosこの列には、テーブルのuuserid列に対する外部キー制約があります。users

DROP TABLE IF EXISTS `mydb`.`users` ;
CREATE  TABLE IF NOT EXISTS `mydb`.`users` (
`uuserid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`ufname` VARCHAR(25) NULL ,
`ulname` VARCHAR(25) NULL ,
`uuname` VARCHAR(45) NULL ,
`upass` CHAR(64) NOT NULL ,
`uemail` VARCHAR(254) NOT NULL ,
`urole` INT NULL DEFAULT 0
) ENGINE = InnoDB;

DROP TABLE IF EXISTS `mydb`.`photos` ;
CREATE  TABLE IF NOT EXISTS `mydb`.`photos` (
`pphotoid` INT NOT NULL PRIMARY KEY,
`pname` VARCHAR(4) NULL ,
`plat` FLOAT(10,6) NULL ,
`plng` FLOAT(10,6) NULL ,
`pflag` DECIMAL(10,0) NULL DEFAULT 0 ,
`pext` VARCHAR(4) NULL ,
`plike` DECIMAL(10,0) NULL DEFAULT 0,
`uuserid`INT NOT NULL
) ENGINE = InnoDB;

Alter Table `photos` add constraint foreign key(`uuserid`) references `users`(`uuserid`);

上記の例では、SQLの最後にステートメントを作成するのではなく、主キーを列自体に設定するステートメントを移動しました。

構文エラーの原因を確認できるように、テーブル作成の外部に外部キー制約を追加する方法を示す方が少しわかりやすいと思いました。外部キー参照に列名がありませんでした。追加すると、上記のコードは完全に実行されます。

于 2013-03-05T21:30:27.393 に答える
0

エラーメッセージが構文エラーを示しているのとまったく同じ場所に構文エラーがあります。

問題は、制約で参照されているフィールドがないことです。句の形式は次のCONSTRAINTようになります。

CONSTRAINT `fkuuserid`
FOREIGN KEY `fkuuserid` (some_field_in_this_table)
REFERENCES `mydb`.`users` (uuserid)
ON DELETE NO ACTION
ON UPDATE NO ACTION

このテーブルにはuuseridフィールドが存在しないため、写真テーブルのどこに論理外部キーがあるのか​​さえ正直にわかりません。

于 2013-03-05T21:21:35.217 に答える