MySQL에서 PostgreSQL로 전환하고 자동 증가 값을 수행하는 방법이 궁금합니다. PostgreSQL 문서에서 데이터 유형 "직렬"을 보았지만 v8.0에서 사용할 때 구문 오류가 발생합니다.
MySQL에서 PostgreSQL로 전환하고 자동 증가 값을 수행하는 방법이 궁금합니다. PostgreSQL 문서에서 데이터 유형 "직렬"을 보았지만 v8.0에서 사용할 때 구문 오류가 발생합니다.
답변:
예, SERIAL은 동등한 기능입니다.
CREATE TABLE foo (
id SERIAL,
bar varchar);
INSERT INTO foo (bar) values ('blah');
INSERT INTO foo (bar) values ('blah');
SELECT * FROM foo;
1,blah
2,blah
SERIAL은 시퀀스를 중심으로 테이블 시간을 생성하는 매크로입니다. 기존 컬럼에서 SERIAL을 변경할 수 없습니다.
"Table"
하고 "table"
그럼 그냥 인용 부호가 그것을두고으로 정규화 table
. 컨벤션은 단순히 Pg에서 따옴표를 사용하지 않습니다. 원하는 경우 대소 문자를 혼합 된 이름으로 사용할 수 있지만 필요하지 않습니다 . CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
작동 SELECT * FROM foobar
합니다.
와 같은 다른 정수 데이터 유형을 사용할 수 있습니다 smallint
.
예 :
CREATE SEQUENCE user_id_seq;
CREATE TABLE user (
user_id smallint NOT NULL DEFAULT nextval('user_id_seq')
);
ALTER SEQUENCE user_id_seq OWNED BY user.user_id;
사용자 직렬 데이터 유형 보다는 고유 한 데이터 유형을 사용하는 것이 좋습니다 .
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html에서 읽은 후 ) . 그러나 왜 당신이 소유자를 변경했는지 잘 모르겠습니다.
이미 존재하는 테이블에서 id에 시퀀스를 추가하려면 다음을 사용할 수 있습니다.
CREATE SEQUENCE user_id_seq;
ALTER TABLE user ALTER user_id SET DEFAULT NEXTVAL('user_id_seq');
ALTER COLUMN user_id
없습니까?
ERROR: syntax error at or near "DEFAULT"
제안 사항이 있습니까?
시퀀스가 MySQL auto_increment 와 같은 것처럼 보이지만 미묘하지만 중요한 차이점이 있습니다.
실패한 쿼리에서 직렬 열이 증가합니다. 이로 인해 행 삭제뿐만 아니라 실패한 쿼리에서 조각화가 발생합니다. 예를 들어 PostgreSQL 데이터베이스에서 다음 쿼리를 실행하십시오.
CREATE TABLE table1 (
uid serial NOT NULL PRIMARY KEY,
col_b integer NOT NULL,
CHECK (col_b>=0)
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
SELECT * FROM table1;
다음과 같은 결과가 나타납니다.
uid | col_b
-----+-------
1 | 1
3 | 2
(2 rows)
uid가 1에서 2가 아닌 1에서 3으로 어떻게되는지 확인하십시오.
다음을 사용하여 직접 시퀀스를 수동으로 생성 한 경우에도 여전히 발생합니다.
CREATE SEQUENCE table1_seq;
CREATE TABLE table1 (
col_a smallint NOT NULL DEFAULT nextval('table1_seq'),
col_b integer NOT NULL,
CHECK (col_b>=0)
);
ALTER SEQUENCE table1_seq OWNED BY table1.col_a;
MySQL의 차이점을 테스트하려면 MySQL 데이터베이스에서 다음을 실행하십시오.
CREATE TABLE table1 (
uid int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
col_b int unsigned NOT NULL
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
조각화없이 다음을 얻어야합니다 .
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
+-----+-------+
2 rows in set (0.00 sec)
이것은 이전 답변에서 @trev에 의해 지적되었습니다.
이를 수동으로 시뮬레이션하려면 uid를 4로 설정하면 나중에 "충돌"됩니다.
INSERT INTO table1 (uid, col_b) VALUES(5, 5);
테이블 데이터 :
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
(3 rows)
다른 인서트를 실행하십시오.
INSERT INTO table1 (col_b) VALUES(6);
테이블 데이터 :
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
4 | 6
이제 다른 인서트를 실행하면 :
INSERT INTO table1 (col_b) VALUES(7);
다음과 같은 오류 메시지와 함께 실패합니다.
오류 : 중복 키 값이 고유 제한 조건 "table1_pkey"을 위반합니다. 세부 사항 : 키 (uid) = (5)이 (가) 이미 존재합니다.
대조적으로, MySQL은 아래와 같이 이것을 정상적으로 처리합니다.
INSERT INTO table1 (uid, col_b) VALUES(4, 4);
이제 uid를 설정하지 않고 다른 행을 삽입하십시오.
INSERT INTO table1 (col_b) VALUES(3);
쿼리가 실패하지 않고 uid는 5로 이동합니다.
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
| 4 | 4 |
| 5 | 3 |
+-----+-------+
테스트는 Linux (x86_64) 및 PostgreSQL 9.4.9 용 MySQL 5.6.33에서 수행되었습니다.
Postgres 10부터는 SQL 표준에 정의 된 자격 증명 열도 지원됩니다.
create table foo
(
id integer generated always as identity
);
명시 적으로 요청하지 않으면 재정의 할 수없는 ID 열을 만듭니다. 다음과 같이 정의 된 열이 있으면 다음 삽입에 실패합니다 generated always
.
insert into foo (id)
values (1);
그러나 이것은 무시 될 수 있습니다 :
insert into foo (id) overriding system value
values (1);
옵션을 사용할 때 generated by default
이것은 본질적으로 기존 serial
구현 과 동일한 동작입니다 .
create table foo
(
id integer generated by default as identity
);
값을 수동으로 제공하는 경우 기본 순서도 serial
열과 마찬가지로 수동으로 조정해야 합니다.
ID 열은 기본적으로 기본 키가 아닙니다 ( serial
열과 마찬가지로 ). 하나 여야하는 경우 기본 키 제약 조건을 수동으로 정의해야합니다.
죄송합니다. 이전 질문을 다시 해시지만 Google에서 처음으로 발생한 스택 오버플로 질문 / 답변입니다.
이 게시물 (Google에서 처음으로 올라온)은 PostgreSQL 10에 대해 더 업데이트 된 구문 사용에 대해 설명합니다. https://blog.2ndquadrant.com/postgresql-10-identity-columns/
어떤 일이 발생합니까?
CREATE TABLE test_new (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
);
희망이 있습니다 :)
GENERATED … AS IDENTITY
명령은 표준 SQL입니다. SQL : 2003 에서 처음 추가 된 후 SQL : 2008 에서 명확 해졌습니다 . 기능 # T174 & F386 & T178을 참조하십시오.
SERIAL 또는 시퀀스 필드에 직접 삽입하지 않도록주의해야합니다. 그렇지 않으면 시퀀스가 삽입 된 값에 도달하면 쓰기가 실패합니다.
-- Table: "test"
-- DROP TABLE test;
CREATE TABLE test
(
"ID" SERIAL,
"Rank" integer NOT NULL,
"GermanHeadword" "text" [] NOT NULL,
"PartOfSpeech" "text" NOT NULL,
"ExampleSentence" "text" NOT NULL,
"EnglishGloss" "text"[] NOT NULL,
CONSTRAINT "PKey" PRIMARY KEY ("ID", "Rank")
)
WITH (
OIDS=FALSE
);
-- ALTER TABLE test OWNER TO postgres;
INSERT INTO test("Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
VALUES (1, '{"der", "die", "das", "den", "dem", "des"}', 'art', 'Der Mann küsst die Frau und das Kind schaut zu', '{"the", "of the" }');
INSERT INTO test("ID", "Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
VALUES (2, 1, '{"der", "die", "das"}', 'pron', 'Das ist mein Fahrrad', '{"that", "those"}');
INSERT INTO test("Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
VALUES (1, '{"der", "die", "das"}', 'pron', 'Die Frau, die nebenen wohnt, heißt Renate', '{"that", "who"}');
SELECT * from test;
이 방법은 확실히 작동합니다. 도움이되기를 바랍니다.
CREATE TABLE fruits(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');
or
INSERT INTO fruits VALUES(DEFAULT,'apple');
다음 링크에서 세부 사항을 확인할 수 있습니다. http://www.postgresqltutorial.com/postgresql-serial/
PostgreSQL 10부터
CREATE TABLE test_new (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
payload text
);