2014-04-14 1 views
2

주제에 대한 이해가 정확하지 않은 것으로 느껴지므로 구체적으로하려고합니다. 내 문제는 alter 문으로 추가 한 외래 키가있는 테이블간에 관계를 만드는 방법을 이해하는 것입니다. 나는이 테이블을 가지고있다.외래 키 및 변경 문과의 MySQL 관계 생성

Tag has a one to one connection to Category 
Category has a many to one connection to User 
User has a one to many connection to Article 

그리고 내가 거기에 문을 사용하는 것이 할 :

이 세 번째 실패
ALTER TABLE tag ADD CONSTRAINT FOREIGN KEY (tag_id) REFERENCES category (category_id); 
ALTER TABLE category ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (user_id); 
ALTER TABLE user ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES article (user_id); 

내 문제가 있음을

CREATE TABLE article (
    content TEXT NOT NULL, 
    published_on DATE NOT NULL, 
    created_on DATE NOT NULL, 
); 

CREATE TABLE category(
    name VARCHAR(30) NOT NULL, 
    date_created DATE NOT NULL, 
); 

CREATE TABLE user(
    income FLOAT(30, 30) NOT NULL, 
    password VARCHAR(30) NOT NULL, 
    picture_url TEXT NOT NULL, 
); 

CREATE TABLE tag(
    description VARCHAR(30) NOT NULL, 
    second_priority FLOAT(30, 30) NOT NULL, 
); 

는 내가 거기 관계를 확인해야합니다. 기사와 사용자의 위치를 ​​전환하면 제약 조건이 통과됩니다. 조금 파고 실험 한 후에 나는 하나가 유일 키이거나 1 차 키이거나 다른 하나가 NULL이 아닌 두 개의 키를 제약 할 수 없다는 것을 알아 냈습니다. 지금까지 나는 어떻게 계속 해야할지 모르겠다. 누군가가 나를 잃어 버렸기 때문에이 테이블들 사이에 일대일, 대다수, 일대일 및 다 대다 관계를 만드는 방법에 대해 가르쳐 주실 수 있겠습니까? 내 머리가 엉망이야. (30) INT를 사용하는 이유는 이 PK를 누락 :

FULL 다도는 :

CREATE DATABASE exam_database; 
USE exam_database; 
CREATE TABLE article (
    content TEXT NOT NULL, 
    published_on DATE NOT NULL, 
    created_on DATE NOT NULL, 
    user_id INT(30) NOT NULL 
); 

CREATE TABLE category(
    name VARCHAR(30) NOT NULL, 
    date_created DATE NOT NULL, 
    category_id INT(30) NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE, 
    user_id INT(30) NOT NULL 
); 

CREATE TABLE user(
    income FLOAT(30, 30) NOT NULL, 
    password VARCHAR(30) NOT NULL, 
    picture_url TEXT NOT NULL, 
    user_id INT(30) NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE 
); 

CREATE TABLE tag(
    description VARCHAR(30) NOT NULL, 
    second_priority FLOAT(30, 30) NOT NULL, 
    tag_id INT(30) NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE 
); 

ALTER TABLE tag ADD CONSTRAINT FOREIGN KEY (tag_id) REFERENCES category (category_id); 
ALTER TABLE category ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (user_id); 
ALTER TABLE user ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES article (user_id); 
+0

귀하의 전체 (키) –

+0

@AnR 여기 ...이 테이블에 대한 문을 만들 전체 코드 –

+1

만약'user_id'가'user' 테이블의 PK라면 (아마도 기대할 것입니다.),'article.user_id'는 분명히 그것을 참조하고 다른 방법은 아닙니다. – eggyal

답변

0

먼저 구조는 약간의 오차가있다? 등 ...해야 귀하의 DB는 다음과 같습니다

CREATE DATABASE exam_database; 
USE exam_database; 
CREATE TABLE article (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE, 
    user_id INT NOT NULL, 
    content TEXT NOT NULL, 
    published_on DATE NOT NULL, 
    created_on DATE NOT NULL 
); 

CREATE TABLE category(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE, 
    user_id INT NOT NULL, 
    name VARCHAR(30) NOT NULL, 
    date_created DATE NOT NULL 
); 

CREATE TABLE user (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE , 
    income FLOAT(30, 30) NOT NULL, 
    password VARCHAR(30) NOT NULL, 
    picture_url TEXT NOT NULL 

); 

CREATE TABLE tag (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE, 
    category_id INT NOT NULL, 
    description VARCHAR(30) NOT NULL, 
    second_priority FLOAT(30, 30) NOT NULL 

); 

둘째처럼 보여야 FKS : 붙여 넣기

ALTER TABLE tag ADD CONSTRAINT FOREIGN KEY (category_id) REFERENCES category (id); 
ALTER TABLE category ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (id); 
ALTER TABLE article ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (id);