Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
이전 | PostgreSQL : 문서 : 9.3 : 데이터 윈 토토 | 8 장. 데이터 유형 | PostgreSQL : 문서 : 9.3 : 범위 사설 토토 |
a범퍼카 토토 유형행 또는 레코드의 구조; 본질적으로 목록 일뿐입니다 필드 이름과 데이터 유형.postgresql범퍼카 토토 유형을 사용할 수 있습니다 간단한 유형을 사용할 수있는 것과 같은 많은 방법으로. 을 위한 예, 테이블 열은 복합재로 선언 될 수 있습니다. 유형.
범퍼카 토토 유형 정의의 두 가지 간단한 예는 다음과 같습니다.
유형 complex as ( r 이중 정밀도, 나는 두 배의 정밀도 ); inventory_item 유형 생성 ( 이름 텍스트, Supplier_id 정수, 가격 숫자 );
구문은와 비슷합니다.생성 테이블, 필드 이름과 유형 만 지정; 제약 조건 없음 (예 :널) 현재 포함될 수 있습니다.as키워드가 필수적입니다. 그것 없이는 시스템이 그럴 것입니다 다른 종류의 생각유형 만들기명령은 의미이며 홀수 구문 오류가 발생합니다.
유형을 정의한 후 테이블을 만들 수 있습니다.
테이블 생성 on_hand ( 항목 inventory_item, 정수를 계산하십시오 ); on_hand 값에 삽입 (행 ( '퍼지 주사위', 42, 1.99), 1000);
또는 기능 :
함수 생성 price_extension (Inventory_item, Integer)은 숫자를 반환합니다 AS 'SELECT $ 1. PRICE * $ 2'언어 SQL; on_hand에서 price_extension (항목, 10)을 선택하십시오.
테이블을 만들 때마다 범퍼카 토토 유형도 테이블과 동일한 이름으로 자동 생성 테이블의 행 유형을 나타냅니다. 예를 들어, 우리는 다음과 같이 말했습니다.
테이블 생성 inventory_item ( 이름 텍스트, Supplier_ID 정수 참조 공급 업체, 가격 숫자 점검 (가격 0) );
그런 다음inventory_item복합재 위에 표시된 유형은 부산물로 나타나며 위와 같이 사용됩니다. Note however an important restriction of the 현재 구현 : 제약 조건이 없기 때문에 a 범퍼카 토토 유형, 테이블 정의에 표시된 제약 조건적용하지 마십시오의 값 테이블 외부의 범퍼카 토토 유형. (부분적인 해결 방법은 다음과 같습니다 범퍼카 토토 유형의 구성원으로 도메인 유형을 사용하십시오.)
문자 그대로 상수로 범퍼카 토토 값을 작성하려면 괄호 안에 필드 값을 쉼표로 분리합니다. 너 필드 값에 이중 인용문을 넣을 수 있으며 경우 그렇게해야합니다. 쉼표 또는 괄호가 들어 있습니다. (자세한 내용이 나타납니다아래.) 따라서 장군 복합 상수의 형식은 다음과 같습니다.
'(val1 , val2, ...) '
예는 다음과 같습니다.
'( "퍼지 주사위", 42,1.99)'
의 유효한 값이 될 것입니다inventory_item위에 정의 된 유형. 필드를 만들기 위해 무효가되고, 목록에있는 위치에 캐릭터를 전혀 쓰지 마십시오. 예를 들어,이 상수는 Null Third 필드를 지정합니다.
'( "퍼지 주사위", 42,)'
null이 아닌 빈 줄을 원한다면 더블을 쓰십시오. 인용 부호:
'( "", 42,)'
여기서 첫 번째 필드는 널 비 빈 줄, 세 번째 필드는 널.
(이 상수는 실제로 일반적인 경우에 지나지 않습니다. 논의 된 유형 상수섹션 4.1.2.7. 상수는 처음에 문자열로 취급됩니다 범퍼카 토토 유형 입력 변환 루틴에 전달되었습니다. 명백한 변환 할 유형을 알리려면 유형 사양이 필요할 수 있습니다. 상수.)
theRow표현 구문도 가능합니다 범퍼카 토토 값을 구성하는 데 사용됩니다. 대부분의 경우 이것은입니다 그 이후로 문자열-문자 구문보다 사용하기가 상당히 간단합니다 여러 층의 인용에 대해 걱정할 필요가 없습니다. 우리 위 의이 방법을 이미 사용했습니다.
행 ( '퍼지 주사위', 42, 1.99) 행 ( '', 42, null)
행 키워드는 실제로 더 많은 경우 선택 사항입니다. 표현의 하나의 필드보다 단순화 될 수 있습니다. 에게:
( '퍼지 주사위', 42, 1.99) ( '', 42, null)
theRowExpression Syntax가 논의됩니다 더 자세히섹션 4.2.13.
범퍼카 토토 열의 필드에 액세스하려면 점을 씁니다. 테이블 이름에서 필드를 선택하는 것과 매우 유사합니다. ~ 안에 사실, 그것은 당신이 자주 테이블 이름에서 선택하는 것과 매우 흡사합니다. 파서를 혼동하지 않도록 괄호를 사용해야합니다. 을 위한 예를 들어, 당신은 우리의 일부 서브 필드를 선택하려고 시도 할 수 있습니다on_hand다음과 같은 것의 예제 테이블
item.name.name on_hand where.price 9.99; 이름을 선택하십시오.
이름 이후로 작동하지 않습니다항목| 열 이름이 아닌 테이블 이름으로 간주on_hand, SQL 구문 규칙 별. 당신은 그것을 써야합니다 이와 같이:
select (item) .name from on_hand where (item) .price 9.99;
또는 테이블 이름을 사용해야하는 경우 (예 : 다중 정보 쿼리), 다음과 같이 :
select (on_hand.item) .name on_hand where (on_hand.item) .price 9.99;
이제 괄호 화 된 객체는 올바르게 해석됩니다 에 대한 참조항목열, 그리고 다음 서브 필드를 선택할 수 있습니다.
유사한 구문 문제가 필드를 선택할 때마다 적용됩니다. 복합 값. 예를 들어, 하나의 필드 만 선택합니다 복합 값을 반환하는 함수의 결과는 다음과 같은 글을 쓰십시오 :
select (my_func (...)). 필드에서 ...
추가 괄호가 없으면 구문이 생성됩니다 오류.
특별 필드 이름*평균"모든 필드", 추가 설명대로섹션 8.16.5.
삽입 및 삽입 및 범퍼카 토토 열 업데이트. 먼저 전체를 삽입하거나 업데이트합니다 열:
mytab (complex_col) 값 ((1.1,2.2)에 삽입); myTab set complex_col = row (1.1,2.2) 여기서 ...;
첫 번째 예는 생략행, 두 번째 그것을 사용합니다. 우리는 어느 쪽이든 그것을 할 수있었습니다.
범퍼카 토토 열의 개별 하위 필드를 업데이트 할 수 있습니다 :
MyTab Set Complex_Col.r = (Complex_Col) .r + 1 Where ...; 업데이트
여기에 우리가 필요하지 않은 (그리고 실제로는 할 수 없음) 열 이름 주위의 괄호 안에 나타납니다SET, 그러나 우리는 참조 할 때 괄호가 필요합니다 동일한 부호의 오른쪽 표현식에서 동일한 열.
그리고 우리는 서브 필드를 대상으로 지정할 수 있습니다삽입도 :
mytab에 삽입 (complex_col.r, complex_col.i) 값 (1.1, 2.2);
열의 모든 서브 필드에 대한 값을 공급하지 않았다면, 나머지 서브 필드는 널로 채워 졌을 것입니다 값.
관련된 다양한 특별 구문 규칙과 동작이 있습니다 범퍼카 토토 유형의 쿼리. 이 규칙은 유용합니다 바로 가기이지만 뒤에 논리를 모르면 혼란 스러울 수 있습니다. 그들을.
inPostgreSQL, A에 대한 참조 쿼리의 테이블 이름 (또는 별칭)은 효과적으로 테이블의 현재 행의 복합 값. 예를 들어, 우리가 있다면 테이블inventory_item표시된대로위, 우리는 할 수 있습니다 쓰다:
inventory_item c;에서 c를 선택하십시오.
이 쿼리는 단일 복합 값 열을 생성하므로 우리는 우리를 생성합니다 다음과 같은 출력이있을 수 있습니다.
c ------------------------- ( "퍼지 주사위", 42,1.99) (1 행)
간단한 이름은 열 이름과 일치합니다. 테이블 이름 이전 에이 예제는 없기 때문에 작동합니다. 열이라는 열C18762_18787
평범한 자격을 갖춘 컬럼-이름 구문table_name.column_name할 수 있습니다 적용되는 것으로 이해필드 선택to 테이블의 현재 행의 복합 값. (효율성을 위해 이유, 그것은 실제로 그런 식으로 구현되지 않았습니다.)
우리가 쓸 때
select c.* inventory_item c;
그런 다음 SQL 표준에 따라 내용을 가져와야합니다. 테이블의 별도 열로 확장되었습니다.
이름 | Supplier_id | 가격 ------------+------------+------- 퍼지 주사위 | 42 | 1.99 (1 행)
쿼리가있는 것처럼
inventory_item c;에서 c.name, c.supplier_id, c.price를 선택하십시오.
PostgreSQL이것을 적용 할 것입니다
AS는 범퍼카 토토 값 표현식에 대한 확장 동작입니다
표시위, 당신
그 가치에 대한 괄호를 쓸 필요가.*간단한 테이블이 아닐 때마다 적용됩니다
이름. 예를 들어, ifmyfunc ()
is
함수 열이있는 범퍼카 토토 유형을 반환a, B및C,이 두 쿼리에는 다음과 같습니다
동일한 결과 :
select (myfunc (x))*에서 some_table; 선택 (myfunc (x)). a, (myfunc (x)). b, (myfunc (x)).
팁 : PostgreSQL손잡이 실제로 첫 번째 형태를 두번째. 그래서이 예에서
myfunc ()
두 구문으로 행당 3 회 호출됩니다. 그렇다면 당신이 그것을 피하고 싶은 값 비싼 기능, 당신이 할 수있는 다음과 같은 쿼리로 :select (m).the오프셋 0절은 Optimizer를 유지합니다 에서"평평한"하위 선택 의 여러 호출로 양식에 도착하십시오.
myfunc ()
.
thecomposite_value.*구문은 이러한 종류의 열 확장을 초래합니다
A의 최상위 레벨에 나타날 때select출력
목록, a반환목록in삽입/업데이트/삭제, a값절또는 A행
건설자. 다른 모든 맥락에서 (중첩 될 때 포함
해당 구성 중 하나 내부에서) 첨부.*범퍼카 토토 값으로의 값은 변경되지 않습니다.
의미가 있기 때문에"모든 열"동일한 범퍼카 토토 값이 다시 생성됩니다. 예를 들어, ifnomefunc ()
범퍼카 토토 값을 허용합니다
인수,이 쿼리는 동일합니다 :
Inventory_item C에서 몇 가지 푸치 (c.*)를 선택하십시오. inventory_item c;에서 몇 가지 핀 (c)을 선택하십시오.
두 경우 모두 현재 행inventory_item는 함수로 전달됩니다 단일 범퍼카 토토 값 인수. 일지라도.*그러한 경우에는 아무것도 사용하지 않습니다 합성 가치가 의도된다는 것이 분명하기 때문에 스타일. ~ 안에 특히, 파서는 고려할 것입니다Cinc.*테이블 이름이나 별칭을 참조합니다 모호성이 없도록 열 이름으로; 반면.*,C테이블 이름 또는 열 이름을 의미하며 실제로는 열 이름 해석이 열이라는 열C.
이러한 개념을 보여주는 또 다른 예는이 모든 것입니다 쿼리는 같은 것을 의미합니다.
inventory_item c order에서 선택 * 선택 *; c. *; inventory_item c order by row (c. *);에서 *를 선택하십시오.
이들 모두주문 by클로스는 지정합니다 행의 범퍼카 토토 값. 그러나 ifinventory_itemC, 첫 번째 사례는 다릅니다 다른 사람들로부터, 그것은 그 열로 만 분류하는 것을 의미합니다. 이전에 표시된 열 이름이 주어지면이 쿼리도 위의 것과 동일합니다 :
select * from inventory_item c order by row (c.name, c.supplier_id, c.price); 선택 * inventory_item c order by (c.name, c.supplier_id, c.price);
(마지막 경우는 키워드가있는 행 생성자를 사용합니다Row생략.)
범퍼카 토토재와 관련된 또 다른 특수 구문 행동 값은 우리가 사용할 수 있다는 것입니다기능 표기법범퍼카 토토 값의 필드 추출. 그만큼 이것을 설명하는 간단한 방법은 표기법입니다필드(테이블)and테이블.필드상호 교환 가능합니다. 예를 들어, 이 쿼리는 동일합니다 :
inventory_item C에서 c.name을 선택하십시오. 여기서 c.price 1000; inventory_item c에서 이름 (c)에서 이름 (c)을 선택하십시오. 여기서 가격 (c) 1000;
또한 단일 인수를 수락하는 함수가있는 경우 범퍼카 토토 유형의 경우 두 가지 표기법으로 호출 할 수 있습니다. 이것들 쿼리는 모두 동일합니다 :
Inventory_item C에서 몇 가지 푸치 (c)를 선택하십시오. inventory_item c에서 몇 가지 핀 (c.*)을 선택하십시오. inventory_item c;에서 c.somefunc을 선택하십시오.
기능 표기법과 필드 표기법 사이 의이 동등성 범퍼카 토토 유형에서 기능을 사용하여 구현할 수 있습니다"컴퓨터 필드". 사용하는 응용 프로그램 위의 마지막 쿼리는 직접 알 필요가 없습니다.약간의 실제 열이 아닙니다 테이블.
팁 :이 동작으로 인해,주는 것은 현명하지 않습니다 단일 범퍼카 토토 유형 인수를 동일한 이름으로 취하는 함수 해당 범퍼카 토토 유형의 필드 중 하나로. 모호성이 있다면 현장 이름 해석이 선호되므로 트릭 없이는 기능을 호출 할 수 없습니다. 강제하는 한 가지 방법 함수 해석은 기능 이름을 스키마-자격으로하는 것입니다. 즉, 쓰기스키마.func(CompositeValue).
복합 값의 외부 텍스트 표현은 구성됩니다 I/O 변환 규칙에 따라 해석되는 항목 개별 필드 유형의 경우, 복합 구조. 장식은 괄호로 구성됩니다 ((및)) 주위 전체 값, 쉼표 (,) 사이 인접한 항목. 괄호 안에있는 공백은 무시되지만 괄호 안에서는 필드 값의 일부로 간주됩니다. 입력에 따라 중요하거나 중요하지 않을 수도 있습니다. 필드 데이터 유형의 변환 규칙. 예를 들어 :
'(42)'
필드 유형이 정수 인 경우 공백은 무시됩니다. 텍스트라면 아닙니다.
앞에서 볼 수 있듯이 복합 값을 작성할 때 개별 필드 값에 이중 인용문을 작성하십시오. 너필수필드 인 경우 그렇게하십시오 그렇지 않으면 값은 복합 값 파서를 혼동합니다. ~ 안에 특히 괄호, 쉼표, 이중 인용문이 포함 된 필드 또는 백 슬래시는 두 번 인용되어야합니다. 이중 견적을 넣기 위해 인용 된 복합 필드 값의 백 슬래시는 백 슬래시. (또한 두 배의 이중 인용문 쌍 필드 값은 이중 인용 문자를 나타내는 데 사용됩니다. SQL 리터럴 스트링의 단일 따옴표 규칙과 유사하게.) 또는 인용을 피하고 백 슬래시 에스케이프를 사용할 수 있습니다 그렇지 않으면 취할 수있는 모든 데이터 문자를 보호하십시오. 복합 구문.
완전히 빈 필드 값 ( 쉼표 또는 괄호)는 널을 나타냅니다. 값을 작성합니다 null이 아닌 빈 줄, 쓰기"".
복합 출력 루틴은 현장에 이중 인용문을 표시합니다. 값이 비어 있거나 괄호, 쉼표를 포함하는 경우 값 이중 인용문, 백 슬래시 또는 공백. (흰색을 위해서 공간은 필수적이지는 않지만 가독성을 도와줍니다.) 이중 인용문과 필드 값에 포함 된 백 슬래시는 두 배가됩니다.
참고 :SQL 명령에 쓰는 내용은 먼저 문자열 문자로 해석 한 다음 복합재로 해석됩니다. 이것은 필요한 백 슬래시 수를 두 배로 늘립니다 (탈출을 가정합니다. 문자열 구문이 사용됩니다). 예를 들어, a를 삽입하려면텍스트이중 견적과 백 슬래시가 들어있는 필드 복합 가치, 당신은 다음을 쓸 필요가 있습니다 :
삽입 ... 값 ( '( "\"\\ ")');String-Literal 프로세서는 한 수준의 백 슬래시를 제거합니다. 그래서 복합 가치 파서에 도착하는 것은( "\"\\ "). 차례로, 문자열은에 공급됩니다.텍스트데이터 유형의 입력 루틴이됩니다"\. (데이터 유형으로 작업하는 경우 입력 루틴은 또한 백 슬래시를 특별히 처리 한 사람,BYTEA예를 들어, 우리는 최대 8 개가 필요할 수 있습니다 명령에 백 슬래시가 저장된 뒷면 슬래시를 가져옵니다. 복합 필드.) 달러 인용 (참조섹션 4.1.2.4) 두 배를 피하기 위해 사용할 수 있습니다. 백 슬래시.
팁 :theRow생성자 구문 일반적으로 범퍼카 토토 문화 구문보다 작업하기가 더 쉽습니다. SQL 명령에 범퍼카 토토 값을 작성할 때. 안에Row, 개별 필드 값은 동일하게 작성됩니다 복합 회원이 아닌 경우 작성되는 방식.