【问题标题】:Foreign Key with TimeStamp Incorrectly Formed时间戳格式不正确的外键
【发布时间】:2016-07-07 13:42:28
【问题描述】:

我在 XAMPP for OS X 中使用 MariaDB 时遇到了一些问题。

我正在开发一个数据库,我必须在其中插入一些引用到其他表中的 TIMESTAMP 属性的外键。

当系统尝试处理“创建外键”语句时,它给了我这个错误:

"errno: 150 "外键格式错误"

这是我的 SQL 命令

CREATE DATABASE IF NOT EXISTS cinguettio;
USE cinguettio;


CREATE TABLE IF NOT EXISTS utente(
    email VARCHAR(50) PRIMARY KEY,
    città VARCHAR(30),
    stato VARCHAR(30),
    provincia VARCHAR(30),
    datanascita DATE,
    luogonascita VARCHAR(30),
    nome VARCHAR(30),
    cognome VARCHAR(30),
    vip VARCHAR(1),
    sesso VARCHAR(1),
    password VARCHAR(20)
);

CREATE TABLE IF NOT EXISTS apprezzamento(
    dataora TIMESTAMP,
    email VARCHAR(50),
    testo VARCHAR(50),
    dataoraimm TIMESTAMP,
    id INT(7),
    PRIMARY KEY (dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email)
);

CREATE TABLE IF NOT EXISTS hobby(
    nome VARCHAR(20) PRIMARY KEY
);


CREATE TABLE IF NOT EXISTS immagine(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    nomefile VARCHAR(30),
    percorso VARCHAR(200),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email)
);

CREATE TABLE IF NOT EXISTS luogo(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    latitudine FLOAT(2,2), 
    longitudine FLOAT(2,2),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email)
);

CREATE TABLE IF NOT EXISTS pratica(
    nome VARCHAR(20),
    email VARCHAR(50),
    PRIMARY KEY (nome, email),
    FOREIGN KEY (email) REFERENCES utente(email),
    FOREIGN KEY (nome) REFERENCES hobby(nome)
);



CREATE TABLE IF NOT EXISTS scrivea(
    dataora TIMESTAMP,
    email VARCHAR(50),
    PRIMARY KEY (dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email),
    FOREIGN KEY (dataora) REFERENCES apprezzamento(dataora)

);

CREATE TABLE IF NOT EXISTS testo(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    contenuto VARCHAR(100),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email)
);

CREATE TABLE IF NOT EXISTS segue(
    segue VARCHAR(50),
    seguito VARCHAR(50),
    PRIMARY KEY (segue, seguito),
    FOREIGN KEY (segue) REFERENCES utente(email),
    FOREIGN KEY (seguito) REFERENCES utente(email)
);

CREATE TABLE IF NOT EXISTS scrivet(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email),

    FOREIGN KEY (id) REFERENCES testo(id)
);

CREATE TABLE IF NOT EXISTS segnala(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email),
    FOREIGN KEY (dataora) REFERENCES testo(dataora),
    FOREIGN KEY (id) REFERENCES testo(id)
);

CREATE TABLE IF NOT EXISTS preferisce(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email),
    FOREIGN KEY (dataora) REFERENCES luogo(dataora),
    FOREIGN KEY (id) REFERENCES luogo(id)
);

CREATE TABLE IF NOT EXISTS pubblica(
    id INT(7),
    dataora TIMESTAMP,
    email VARCHAR(50),
    PRIMARY KEY (id, dataora, email),
    FOREIGN KEY (email) REFERENCES utente(email),
    FOREIGN KEY (dataora) REFERENCES luogo(dataora),
    FOREIGN KEY (id) REFERENCES luogo(id)
);

直到桌子“scrivet”一切正常,然后它就停止了。我确定问题出在属性“dataora”上,因为我尝试将其删除并且效果很好。

那么……我该怎么办?

【问题讨论】:

标签: mysql database phpmyadmin


【解决方案1】:

您不应在复合键或任何键中使用时间戳。

Use timestamp(or datetime) as part of primary key (or part of clustered index)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 2017-05-29
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多