[SQL] SQL은 : 2 개의 다른 AUTO_INCREMENT와의 관계 테이블 만들기
SQLSQL은 : 2 개의 다른 AUTO_INCREMENT와의 관계 테이블 만들기
나는 물론 기본 키의 그들의 자신의 자동 증가 ID를 함께 모두 2 개 테이블을 가지고있다.
나는이 두 테이블 간의 관계를 확립하기 위해 3 테이블을 생성 할 때, 나는 항상 오류가 있습니다.
첫 번째는 내가 그 2에서 AUTO_INCREMENT 문을 삭제하므로 SQL 나 때문에 형의 일치 실패, 그들에게 외래 키를 만들 수 없습니다 때 두 번째가 발생, 당신은 단지 1 자동 증분 열이 수에 관한 것입니다.
나는 자동 증가 기능을 잃지 않고 관계형 테이블을 만들 수있는 방법이 있나요?
또 다른 가능한 (그러나 preffered) 솔루션은 물론, 아닌 자동 증가 문, 사용자의 사용자 이름 첫 번째 테이블에 다른 기본 키,이있을 수 있습니다. 그것은 피할 수 있습니까?
미리 감사드립니다.
해결법
-
==============================
1.당신은 몇 가지 기본 개념을 오해하고, 어려움은 기인한다. 우리는 당신이 그것을 인식으로, 첫째없는 문제를 개념을 해결해야하고, 결과적으로 문제가 사라집니다.
당신은 몇 가지 기본 개념을 오해하고, 어려움은 기인한다. 우리는 당신이 그것을 인식으로, 첫째없는 문제를 개념을 해결해야하고, 결과적으로 문제가 사라집니다.
아니, 그들은하지 않습니다. 즉 일반적인 오해이다. 그리고 문제는 계속 일어날 보장됩니다.
아이디 필드는 영어 또는 기술 또는 관계형 감각에 기본 키가 될 수 없습니다.
아이디 필드에 기본 키는 행의 고유성을 제공하지 않습니다. 따라서 행을 포함하는 관계형 테이블이 아니며, 그것은 그가없는 경우, 다음 레코드를 포함하는 파일입니다. 그것은 관계형 데이터베이스의 테이블을 가지고, 또는 속도 (당신이 전원 만 가입을 알고 있어야합니다이 단계에서) 무결성, 또는 전원의이 없습니다.
이 코드 (MS SQL 2008)를 실행하고 그것을 자신에게 증명한다. 간단하게이를 읽고 이해 한 다음이 대답의 나머지 부분을 읽어 진행하지 마십시오,이 코드를 더 읽기 전에 실행해야합니다. 그것은 치료 가치가있다.
CREATE TABLE dumb_file ( id INT NOT NULL IDENTITY PRIMARY KEY, name_first CHAR(30) NOT NULL, name_last CHAR(30) NOT NULL ) INSERT dumb_file VALUES ( "Mickey", "Mouse" ) -- succeeds INSERT dumb_file VALUES ( "Mickey", "Mouse" ) -- succeeds, but not intended INSERT dumb_file VALUES ( "Mickey", "Mouse" ) -- succeeds, but not intended SELECT * FROM dumb_file
공지 사항 당신은 중복 행이 있는지 확인하십시오. 관계형 테이블의 고유 행이 필요합니다. 또한 증거는 관계형 테이블이, 또는 하나의 품질의하지 않습니다.
공지 사항 보고서에서, 고유 한 유일한 것은, 어떤 사용자가 볼 수 없습니다에 대한 더 사용자 염려, 그것은 아주 바보 "선생님"에 넣어 당신에게 몇 가지 추가 말도 데이터입니다하지가 않기 때문에 ID 필드는 것을 모든 파일. 당신은 기록 고유성하지만 행의 고유성을 가지고있다.
데이터 (실제 데이터 뺀 외부 첨가)의 관점에서, name_first 데이터 name_last과는 ID 필드없이 존재할 수있다. 사람은 ID가 자신의 이마에 도장을받지 않고 이름과 성을 가지고있다.
당신이 당신에게 그 혼란을 사용하고 있는지 두 번째 것은 AUTOINCREMENT입니다. 기록을 삽입 할 때 당신은 어떤 관계 능력 기록 파일링 시스템을 구현하는 경우, 확인, 그것은 도움이 될 것입니다, 당신은 코드 증가가 없습니다. 당신이 관계형 데이터베이스를 구현하는 경우 당신이 그것을 사용하지 않을 것이기 때문에, 그것은, 전혀 가치가 없다. 대부분의 사람들이 사용하지 않을 것을 SQL의 많은 기능이 있습니다.
그래서 업그레이드 어떻게, 권한 상승이 순서대로 관계형 테이블에 중복 행의 전체입니다 dumb_file는 관계형 테이블의 자질과 몇 가지 이점을 얻을 수 있습니까? 이 세 가지 단계가 있습니다.
조언 이러한 종료 시간에, 우리는 그들 중 많은 사람들이있을 것이다. 참고 잘,이 게시물의 상세한 증거에 의해, ID 열을 전파은 "교사는"단순히 관계형 모델 또는 관계형 데이터베이스를 이해하지 않습니다. 특히 그것에 대해 책을 쓰는 사람들.
를 보면 알 수있는 바와 같이, 그들은 사전 1970 ISAM 기술에 갇혀있다. 그것이 그들이 이해 전부입니다, 그리고 그들이 가르 칠 수있는 모든 것입니다. 그들은 등 액세스, 복구, 백업의 용이성을 위해, SQL 데이터베이스 컨테이너를 사용하지만, 내용이없는 관계 무결성, 전력, 또는 속도로 순수 녹음 신고 시스템입니다. AFAIC, 그것은 심각한 사기입니다.
ID 필드 외에도 물론, 키 관계형 또는 아니라 개념 몇 가지 항목이 날은 무덤 결론을 형성 원인, 함께 있음을,있다. 그 다른 항목이 게시물의 범위를 벗어납니다.
바보의 하나의 특정 쌍은 현재 첫 번째 정규 양식에 대한 공격을 장착한다. 그들은 정신 병원에 속한다.
이제 귀하의 질문의 나머지 부분에 대한.
즉 자기 모순 문장이다. 난 당신이, 관계형 테이블 "기능"AUTOINCREMENT에 대한 필요가 없습니다 내 설명에서 이해 신뢰; 파일이 AUTOINCREMENT이있는 경우, 그것은 관계형 테이블이 아닙니다.
AUTOINCREMENT 한 가지 좋은에만 : 만약 당신이 왼쪽 아래로 상단에 A, B, 그리고 C라는 이름의 필드, 그리고 기록을 숫자로 가득 SQL 데이터베이스 컨테이너에 Excel 스프레드 시트를 생성 할 경우에 한정해. 데이터베이스 측면에서, 그 구성은 데이터의 소스가 아닌 SELECT 데이터의 평탄화도, (정규화)의 결과이다.
기술 연구에서, 즉 주관적이기 때문에 우리는 환경에 대한 상관 없어, 모든 시간을 변경합니다. 그 목적이기 때문에 우리는 기술적 인 정확성에 대한 관심, 그리고 그것을 변경되지 않습니다.
예, 그것은 불가피하다. 그것은 단지 시간 문제이기 때문에; 버그의 수; "할 수는 도스 없음"의 수; 사용자의 수는 사실을 직면 할 때까지 거짓 선언을 극복하고, 실현이, 비명 소리 :
예, 세 번째 테이블 전체 문제는 일치하여, 다음 제거되기 때문이다.
즉, 세 번째 테이블 연관 테이블이다. (기본 키)에 필요한 유일한 키는 두 부모 기본 키의 복합이다. 보장하지만하지 자신의 ID에 의해, 자신의 키에 의해 식별 된 행의 고유성있다.
당신을 구현하는 ID 필드의 오류를 가르쳐 같은 "교사는"그냥 평범한 테이블로, 그것은 불필요, 연관 테이블에서 ID 필드를 구현하는 오류를 가르치기 때문에 그것에 대해 당신을 경고하고, 어떤 목적을 제공하지 중복을 소개하고 혼란을 야기한다. 제공하는 두 개의 키가 이미 있기 때문에 그리고 그것은 얼굴에서 우리를보고, 이중 불필요.
그들은 RM, 또는 관계형 용어를 이해하지 않기 때문에, 그들은 연관 테이블 "링크"또는 테이블을 "지도"를 호출합니다. 그들이 ID 필드가있는 경우, 그들은 실제로 파일입니다.
ID 필드는 조회 또는 참조 테이블을 위해 할 특히 어리석은 것입니다. 그들 대부분은 코드이기 때문에 고유의 (해야한다), 그 (것)들에있는 코드의 목록을 열거 할 필요가 없습니다, 인식 코드를 가지고있다.
또한, FKS 같은 자식 테이블의 코드를 가지고, 좋은 것입니다 코드가 훨씬 더 의미가있다, 그것은 종종 unnecesary 가입 저장 :
SELECT ... FROM child_table -- not the lookup table WHERE gender_code = "M" -- FK in the child, PK in the lookup
대신에:
SELECT ... FROM child_table WHERE gender_id = 6 -- meaningless to the maintainer
또는 더 나쁜 :
SELECT ... FROM child_table C -- that you are trying to determine JOIN lookup_table L ON C.gender_id = L.gender_id WHERE L.gender_code = "M" -- meaningful, known
당신이 설명에 조회 코드와 고유성에 고유성이 필요합니다 참고이 피할 수없는 뭔가 하나입니다. 즉, 두 열의 각각에서의 중복을 방지하는 유일한 방법이다 :
CREATE TABLE gender ( gender_code CHAR(2) NOT NULL, name CHAR(30) NOT NULL CONSTRAINT PK PRIMARY KEY ( gender_code ) CONSTRAINT AK UNIQUE ( name ) )
귀하의 질문에 세부 사항에서, 나는 당신이 SQL 구문 및 FK 정의 문제가 있다고 의심 나는 당신이 (당신이 파일 정의를 부여하지 않았기 때문에) 예로서 필요로하는 전체 솔루션을 제공 할 수 있도록 :
CREATE TABLE user ( -- Typical Identifying Table user_name CHAR(16) NOT NULL, -- Short PK name_first CHAR(30) NOT NULL, -- Alt Key.1 name_last CHAR(30) NOT NULL, -- Alt Key.2 birth_date DATE NOT NULL -- Alt Key.3 CONSTRAINT PK -- unique user_name PRIMARY KEY ( user_name ) CONSTRAINT AK -- unique person identification PRIMARY KEY ( name_last, name_first, birth_date ) ) CREATE TABLE sport ( -- Typical Lookup Table sport_code CHAR(4) NOT NULL, -- PK Short code name CHAR(30) NOT NULL -- AK CONSTRAINT PK PRIMARY KEY ( sport_code ) CONSTRAINT AK PRIMARY KEY ( name ) ) CREATE TABLE user_sport ( -- Typical Associative Table user_name CHAR(16) NOT NULL, -- PK.1, FK sport_code CHAR(4) NOT NULL, -- PK.2, FK start_date DATE NOT NULL CONSTRAINT PK PRIMARY KEY ( user_name, sport_code ) CONSTRAINT user_plays_sport_fk FOREIGN KEY ( user_name ) REFERENCES user ( user_name ) CONSTRAINT sport_occupies_user_fk FOREIGN KEY ( sport_code ) REFERENCES sport ( sport_code ) )
기본 키 선언은 기본 키이며, 정직하고 있습니다; ID 없음; AUTOINCREMENT 없음; 별도의 인덱스; 중복 행 없음; 어떤 잘못된 기대; 파생적 문제.
다음은 정의로 이동하는 데이터 모델이다.
from https://stackoverflow.com/questions/29639121/sql-creating-a-relation-table-with-2-different-auto-increment by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 자바 프로그램에 방지 SQL 주입 공격 (0) | 2020.04.02 |
---|---|
[SQL] MySQL의 재귀? (0) | 2020.04.02 |
[SQL] GROUP BY와 집계 순차적 인 숫자 값 (0) | 2020.04.02 |
[SQL] PostgreSQL은 : 같은 쿼리에서 계산 된 열을 사용하여 (0) | 2020.04.02 |
[SQL] 어떻게 동적 SQL 쿼리 세트 테이블 이름? (0) | 2020.04.02 |