Các tính năng ẩn của PostgreSQL [đã đóng]


80

Tôi ngạc nhiên vì điều này vẫn chưa được đăng. Bất kỳ thủ thuật thú vị nào mà bạn biết về Postgres? Các tùy chọn cấu hình ít người biết đến và các thủ thuật thay đổi tỷ lệ / hiệu suất được đặc biệt hoan nghênh.

Tôi chắc rằng chúng ta có thể đánh bại 9 nhận xét trên chuỗi MySQL tương ứng :)

Câu trả lời:


76

Vì postgres thông minh hơn MySQL rất nhiều, nên không có nhiều "thủ thuật" để báo cáo ;-)

Sách hướng dẫn có một số mẹo hiệu suất hay .

Một số điều khác liên quan đến hiệu suất cần ghi nhớ:

  • Đảm bảo đã bật autovacuum
  • Đảm bảo rằng bạn đã xem qua postgres.conf của mình (kích thước bộ nhớ cache hiệu quả, bộ đệm được chia sẻ, bản ghi nhớ công việc ... rất nhiều tùy chọn ở đó để điều chỉnh).
  • Sử dụng pgpool hoặc pgbouncer để giữ cho kết nối cơ sở dữ liệu "thực" của bạn ở mức tối thiểu
  • Tìm hiểu cách GIẢI THÍCH và PHÂN TÍCH GIẢI THÍCH hoạt động. Học cách đọc đầu ra.
  • CLUSTER sắp xếp dữ liệu trên đĩa theo một chỉ mục. Có thể cải thiện đáng kể hiệu suất của các bảng lớn (hầu hết) chỉ đọc. Phân cụm là hoạt động một lần: khi bảng được cập nhật sau đó, các thay đổi sẽ không được phân nhóm.

Dưới đây là một số điều tôi thấy hữu ích mà không liên quan đến cấu hình hoặc hiệu suất.

Để xem những gì hiện đang xảy ra:

select * from pg_stat_activity;

Tìm kiếm các chức năng khác:

select * from pg_proc WHERE proname ~* '^pg_.*'

Tìm kích thước của cơ sở dữ liệu:

select pg_database_size('postgres');
select pg_size_pretty(pg_database_size('postgres'));

Tìm kích thước của tất cả các cơ sở dữ liệu:

select datname, pg_size_pretty(pg_database_size(datname)) as size
  from pg_database;

Tìm kích thước của bảng và chỉ mục:

select pg_size_pretty(pg_relation_size('public.customer'));

Hoặc, liệt kê tất cả các bảng và chỉ mục (có thể dễ dàng hơn để xem điều này):

select schemaname, relname,
    pg_size_pretty(pg_relation_size(schemaname || '.' || relname)) as size
  from (select schemaname, relname, 'table' as type
          from pg_stat_user_tables
        union all
        select schemaname, relname, 'index' as type
          from pg_stat_user_indexes) x;

Ồ, và bạn có thể lồng các giao dịch, khôi phục các giao dịch từng phần ++

test=# begin;
BEGIN
test=# select count(*) from customer where name='test';
 count 
-------
     0
(1 row)
test=# insert into customer (name) values ('test');
INSERT 0 1
test=# savepoint foo;
SAVEPOINT
test=# update customer set name='john';
UPDATE 3
test=# rollback to savepoint foo;
ROLLBACK
test=# commit;
COMMIT
test=# select count(*) from customer where name='test';
 count 
-------
     1
(1 row)

Cảm ơn. EDIT: Đã thêm thông tin về CLUSTER.
tommym

Tôi đã nhận thấy rằng việc hiển thị kích thước cơ sở dữ liệu là một trong những tính năng của "\ l" trong psql phiên bản beta 8,4. Cho đến lúc đó, tôi nghĩ 8.3 có một hàm pg_size_pretty () để kiểm tra kích thước tính bằng byte.
araqnid

Cảm ơn vì tiền hỗ trợ! Không biết về pg_size_pretty. Tôi đã cập nhật câu trả lời của mình để bao gồm nó.
tommym

3
thay thế (câu trả lời, 'per say', 'per se')
asjo

23

Các đơn giản nhất Bí quyết để cho postgresql thực hiện tốt hơn rất nhiều (ngoài thiết lập và sử dụng các chỉ số thích hợp dĩ nhiên) chỉ là để cho nó RAM hơn để làm việc với (nếu bạn chưa làm như vậy). Trên hầu hết các cài đặt mặc định, giá trị cho shared_buffers quá thấp (theo ý kiến ​​của tôi). Bạn có thể đặt

shared_buffers

trong postgresql.conf. Chia số này cho 128 để có giá trị xấp xỉ dung lượng bộ nhớ (tính bằng MB) mà postgres có thể yêu cầu. Nếu bạn lên nó đủ, điều này sẽ làm cho postgresql bay. Đừng quên khởi động lại postgresql.

Trên các hệ thống Linux, khi postgresql không bắt đầu lại, bạn có thể đã đạt đến giới hạn kernel.shmmax. Đặt nó cao hơn với

sysctl -w kernel.shmmax=xxxx

Để điều này tồn tại giữa các lần khởi động, hãy thêm mục nhập kernel.shmmax vào /etc/sysctl.conf.

Bạn có thể tìm thấy toàn bộ các thủ thuật Postgresql tại đây :


17

Postgres có một phương tiện xử lý datetime rất mạnh mẽ nhờ hỗ trợ INTERVAL của nó.

Ví dụ:

select NOW(), NOW() + '1 hour';
              now              |           ?column?            
-------------------------------+-------------------------------
 2009-04-18 01:37:49.116614+00 | 2009-04-18 02:37:49.116614+00
(1 row)



select current_date ,(current_date +  interval '1 year')::date;
    date             |  date            
---------------------+----------------
 2014-10-17          | 2015-10-17
(1 row)

Bạn có thể ép nhiều chuỗi thành một kiểu INTERVAL.


15

BẢN SAO

Tôi sẽ bắt đầu. Bất cứ khi nào tôi chuyển sang Postgres từ SQLite, tôi thường có một số bộ dữ liệu thực sự lớn. Điều quan trọng là tải các bảng của bạn bằng SAO CHÉP TỪ thay vì thực hiện INSERTS. Xem tài liệu:

http://www.postgresql.org/docs/8.1/static/sql-copy.html

Ví dụ sau sao chép một bảng tới máy khách bằng cách sử dụng thanh dọc (|) làm dấu phân cách trường:

COPY country TO STDOUT WITH DELIMITER '|';

Để sao chép dữ liệu từ một tệp vào bảng quốc gia:

COPY country FROM '/usr1/proj/bray/sql/country_data';

Xem thêm tại đây: Chèn số lượng lớn nhanh hơn trong sqlite3?


2
Điều này cũng có ích cho việc nhập csv.
ChristopheD

Trong các bản phát hành gần đây (ít nhất là 8.3, có thể sớm hơn) nếu bạn TẠO hoặc TRUNCATE bảng bạn đang điền trong cùng một giao dịch với BẢN SAO, nó sẽ không chạm vào nhật ký WAL và bạn thậm chí sẽ nhận được hiệu suất nhanh hơn. postgresql.org/docs/8.3/static/populate.html
TREE

12
  • Yêu thích của tôi cho đến nay là generate_series: cuối cùng một cách sạch sẽ để tạo các bộ hàng giả.
  • Khả năng sử dụng giá trị tương quan trong một LIMITmệnh đề của truy vấn con:

    SELECT  (
            SELECT  exp_word
            FROM    mytable
            OFFSET id
            LIMIT 1
            )
    FROM    othertable
    
  • Khả năng sử dụng nhiều tham số trong các tổng hợp tùy chỉnh (không được đề cập trong tài liệu): xem bài viết trong blog của tôi để biết ví dụ.

1
+1, create_series () chỉ là những gì bạn cần cho khá nhiều thứ (ví dụ: bất cứ khi nào bạn cần một "bảng giả"). Đoạn mã thứ 2 trông cũng hấp dẫn.
j_random_hacker

9

Một trong những điều tôi thực sự thích về Postgres là một số kiểu dữ liệu được hỗ trợ trong các cột. Ví dụ, có các loại cột được tạo để lưu trữ Địa chỉ mạngMảng . Các chức năng tương ứng ( Địa chỉ mạng / Mảng ) cho các loại cột này cho phép bạn thực hiện rất nhiều thao tác phức tạp bên trong các truy vấn mà bạn phải thực hiện bằng cách xử lý kết quả thông qua mã trong MySQL hoặc các công cụ cơ sở dữ liệu khác.


2
Và bạn có thể dễ dàng tạo ra các kiểu của riêng mình nếu những kiểu tiêu chuẩn không phù hợp với bạn!
bortzmeyer

8

Mảng thực sự thú vị khi bạn làm quen với chúng. Giả sử bạn muốn lưu trữ một số liên kết siêu giữa các trang. Bạn có thể bắt đầu bằng cách nghĩ về việc tạo một Table như sau:

CREATE TABLE hyper.links (
     tail INT4,
     head INT4
);

Nếu bạn cần lập chỉ mục cột đuôi và bạn có, chẳng hạn 200.000.000 hàng liên kết (như wikipedia sẽ cung cấp cho bạn), bạn sẽ thấy mình có một Bảng khổng lồ và một Chỉ mục khổng lồ.

Tuy nhiên, với PostgreSQL, bạn có thể sử dụng định dạng Bảng này để thay thế:

CREATE TABLE hyper.links (
     tail INT4,
     head INT4[],
     PRIMARY KEY(tail)
);

Để nhận được tất cả các đầu cho một liên kết, bạn có thể gửi một lệnh như thế này (unnest () là tiêu chuẩn kể từ 8.4):

SELECT unnest(head) FROM hyper.links WHERE tail = $1;

Truy vấn này nhanh một cách đáng ngạc nhiên khi nó được so sánh với tùy chọn đầu tiên (unnest () là nhanh và Chỉ mục nhỏ hơn nhiều). Hơn nữa, Bảng và Chỉ mục của bạn sẽ chiếm ít bộ nhớ RAM và không gian HD hơn nhiều, đặc biệt là khi Mảng của bạn dài đến mức chúng được nén thành Bảng nướng. Mảng thực sự mạnh mẽ.

Lưu ý: trong khi unnest () sẽ tạo các hàng từ một Mảng, thì array_agg () sẽ tổng hợp các hàng thành một Mảng.


6

Chế độ xem vật chất hóa khá dễ thiết lập:

CREATE VIEW my_view AS SELECT id, AVG(my_col) FROM my_table GROUP BY id;
CREATE TABLE my_matview AS SELECT * FROM my_view;

Điều đó tạo ra một bảng mới, my_matview, với các cột và giá trị của my_view. Sau đó, có thể thiết lập trình kích hoạt hoặc tập lệnh cron để giữ cho dữ liệu được cập nhật hoặc nếu bạn lười:

TRUNCATE my_matview;
INSERT INTO my_matview SELECT * FROM my_view;

6
  • Thừa kế..infact Nhiều thừa kế (như trong "kế thừa" cha-con không phải là kế thừa quan hệ 1-1 mà nhiều khung công tác web triển khai khi làm việc với postgres).

  • PostGIS (tiện ích mở rộng không gian), một tiện ích bổ sung tuyệt vời cung cấp bộ hàm hình học và lưu trữ tọa độ toàn diện. Được sử dụng rộng rãi trong nhiều địa chỉ địa lý mã nguồn mở (ví dụ như OpenLayers, MapServer, Mapnik, v.v.) và chắc chắn tốt hơn so với các phần mở rộng không gian của MySQL.

  • Viết các thủ tục bằng các ngôn ngữ khác nhau, ví dụ như C, Python, Perl, v.v. (làm cho cuộc sống của bạn trở nên dễ dàng hơn với mã nếu bạn là nhà phát triển chứ không phải db-admin).

    Ngoài ra, tất cả các thủ tục có thể được lưu trữ bên ngoài (dưới dạng mô-đun) và có thể được gọi hoặc nhập trong thời gian chạy bằng các đối số được chỉ định. Bằng cách đó, bạn có thể kiểm soát mã nguồn và gỡ lỗi mã một cách dễ dàng.

  • Một danh mục khổng lồ và toàn diện về tất cả các đối tượng được triển khai trong cơ sở dữ liệu của bạn (tức là bảng, ràng buộc, chỉ mục, v.v.).

    Tôi luôn thấy vô cùng hữu ích khi chạy một vài truy vấn và nhận được tất cả thông tin meta, ví dụ: tên ràng buộc và trường mà chúng đã được triển khai, tên chỉ mục, v.v.

    Đối với tôi, tất cả trở nên cực kỳ tiện dụng khi tôi phải tải dữ liệu mới hoặc cập nhật hàng loạt trong các bảng lớn (tôi sẽ tự động vô hiệu hóa trình kích hoạt và thả chỉ mục) và sau đó tạo lại chúng một cách dễ dàng sau khi xử lý xong. Ai đó đã làm một công việc xuất sắc khi viết một số truy vấn này.

    http://www.alberton.info/postgresql_meta_info.html

  • Nhiều lược đồ trong một cơ sở dữ liệu, bạn có thể sử dụng nó nếu cơ sở dữ liệu của bạn có số lượng bảng lớn, bạn có thể coi các lược đồ như các danh mục. Tất cả các bảng (bất kể đó là giản đồ nào) đều có quyền truy cập vào tất cả các bảng và hàm khác có trong db mẹ.


+1 Tôi không thể tin rằng đa thừa kế lại kém xa đến thế này.
Adam Gent


4
select pg_size_pretty(200 * 1024)

đã thử điều này nhưng PostgreSQL 9.3bị lỗi
Vivek S.

@WingedPanther Lỗi của bạn là gì? Dưới đây 9,3, nó cũng có một lỗi (đã không có lỗi đường trở về năm 2009 sau đó), việc sửa chữa là bạn cần phải cast số nguyên để số nguyên lớn:pg_size_pretty((200 * 1024)::bigint)
Michael Buen

Vâng, đó là điều
Vivek S.

3

pgcrypto : nhiều chức năng mật mã hơn các mô-đun mật mã của nhiều ngôn ngữ lập trình cung cấp, tất cả đều có thể truy cập trực tiếp từ cơ sở dữ liệu. Nó làm cho các công cụ mật mã trở nên vô cùng dễ dàng.


3

Cơ sở dữ liệu có thể được sao chép bằng:

createb -T old_db new_db

Tài liệu cho biết:

đây không (chưa) nhằm mục đích chung là "CƠ SỞ DỮ LIỆU SAO CHÉP"

nhưng nó hoạt động tốt đối với tôi và nhanh hơn nhiều so với

createb new_db

pg_dump old_db | psql new_db


2

Bộ nhớ lưu trữ cho dữ liệu bỏ đi / biến toàn cục

Bạn có thể tạo một không gian bảng nằm trong RAM và các bảng (có thể được mở khóa, trong 9.1) trong không gian bảng đó để lưu trữ dữ liệu bỏ đi / các biến toàn cục mà bạn muốn chia sẻ qua các phiên.

http://magazine.redhat.com/2007/12/12/tip-from-an-rhce-memory-storage-on-postgresql/

Khóa tư vấn

Những điều này được ghi lại trong một khu vực khó hiểu của sách hướng dẫn:

http://www.postgresql.org/docs/9.0/interactive/functions-admin.html

Đôi khi, nó nhanh hơn việc thu thập nhiều khóa cấp hàng và chúng có thể được sử dụng để giải quyết các trường hợp FOR UPDATE không được triển khai (chẳng hạn như truy vấn CTE đệ quy).


4
Tạo một vùng bảng trong RAM là một ý tưởng cực kỳ tồi. Không làm điều này, bạn có nguy cơ bị hỏng nghiêm trọng và không thể phục hồi cho toàn bộ cơ sở dữ liệu. Sử dụng UNLOGGEDbảng.
Craig Ringer

2

Đây là danh sách yêu thích của tôi về các tính năng ít người biết.

DDL giao dịch

Gần như mọi câu lệnh SQL đều được giao dịch trong Postgres. Nếu bạn tắt tính năng tự động gửi, bạn có thể làm như sau:

drop table customer_orders;
rollback;
select *
from customer_orders;

Loại phạm vi và ràng buộc loại trừ

Theo hiểu biết của tôi, Postgres là RDBMS duy nhất cho phép bạn tạo một ràng buộc để kiểm tra xem hai phạm vi có trùng nhau hay không. Một ví dụ là bảng chứa giá sản phẩm với ngày "hợp lệ từ" và "hợp lệ cho đến":

create table product_price
(
   price_id      serial        not null primary key,
   product_id    integer       not null references products,
   price         numeric(16,4) not null,
   valid_during  daterange not null
);

Các tính năng của NoSQL

Các hstore phần mở rộng cung cấp một cửa hàng giá trị / linh hoạt và rất nhanh quan trọng mà có thể được sử dụng khi các bộ phận của cơ sở dữ liệu cần phải "schema-ít". JSON là một tùy chọn khác để lưu trữ dữ liệu theo kiểu không có giản đồ và

insert into product_price 
  (product_id, price, valid_during)
values 
  (1, 100.0, '[2013-01-01,2014-01-01)'),
  (1,  90.0, '[2014-01-01,)');


-- querying is simply and can use an index on the valid_during column
select price
from product_price
where product_id = 42
  and valid_during @> date '2014-10-17';

Kế hoạch thực hiện ở trên trên một bảng có 700.000 hàng:

Index Scan using check_price_range on public.product_price  (cost=0.29..3.29 rows=1 width=6) (actual time=0.605..0.728 rows=1 loops=1)
  Output: price
  Index Cond: ((product_price.valid_during @> '2014-10-17'::date) AND (product_price.product_id = 42))
  Buffers: shared hit=17
Total runtime: 0.772 ms

Để tránh chèn các hàng có phạm vi hợp lệ chồng chéo, một ràng buộc duy nhất đơn giản (và hiệu quả) có thể được xác định:

alter table product_price
  add constraint check_price_range 
  exclude using gist (product_id with =, valid_during with &&)

vô cực

Thay vì yêu cầu một ngày "thực" trong tương lai, Postgres có thể so sánh ngày với vô hạn. Ví dụ: khi không sử dụng phạm vi ngày, bạn có thể làm như sau

insert into product_price 
  (product_id, price, valid_from, valid_until)
values 
  (1,  90.0, date '2014-01-01', date 'infinity');

Các biểu thức bảng chung có thể viết được

Bạn có thể xóa, chèn và chọn trong một câu lệnh:

with old_orders as (
   delete from orders
   where order_date < current_date - interval '10' year
   returning *
), archived_rows as (
   insert into archived_orders 
   select * 
   from old_orders
   returning *
)
select *
from archived_rows;

Ở trên sẽ xóa tất cả các đơn hàng cũ hơn 10 năm, di chuyển chúng vào archived_ordersbảng và sau đó hiển thị các hàng đã được di chuyển.


2

1.) Khi bạn cần thêm thông báo vào truy vấn, bạn có thể sử dụng nhận xét lồng nhau

SELECT /* my comments, that I would to see in PostgreSQL log */
       a, b, c
   FROM mytab;

2.) Loại bỏ các khoảng trắng theo dõi khỏi tất cả trường textvarchartrong cơ sở dữ liệu.

do $$
declare
    selectrow record;
begin
for selectrow in
select 
       'UPDATE '||c.table_name||' SET '||c.COLUMN_NAME||'=TRIM('||c.COLUMN_NAME||')  WHERE '||c.COLUMN_NAME||' ILIKE ''% '' ' as script
from (
       select 
          table_name,COLUMN_NAME
       from 
          INFORMATION_SCHEMA.COLUMNS 
       where 
          table_name LIKE 'tbl%'  and (data_type='text' or data_type='character varying' )
     ) c
loop
execute selectrow.script;
end loop;
end;
$$;

3.) Chúng ta có thể sử dụng một hàm cửa sổ để loại bỏ các hàng trùng lặp rất hiệu quả:

DELETE FROM tab 
  WHERE id IN (SELECT id 
                  FROM (SELECT row_number() OVER (PARTITION BY column_with_duplicate_values), id 
                           FROM tab) x 
                 WHERE x.row_number > 1);

Một số phiên bản được tối ưu hóa của PostgreSQL (với ctid):

DELETE FROM tab 
  WHERE ctid = ANY(ARRAY(SELECT ctid 
                  FROM (SELECT row_number() OVER (PARTITION BY column_with_duplicate_values), ctid 
                           FROM tab) x 
                 WHERE x.row_number > 1));

4.) Khi chúng ta cần xác định trạng thái của máy chủ, thì chúng ta có thể sử dụng một hàm:

SELECT pg_is_in_recovery();

5.) Nhận lệnh DDL của chức năng.

select pg_get_functiondef((select oid from pg_proc where proname = 'f1'));

6.) Thay đổi an toàn kiểu dữ liệu cột trong PostgreSQL

create table test(id varchar );
insert into test values('1');
insert into test values('11');
insert into test values('12');

select * from test
--Result--
id
character varying
--------------------------
1
11
12

Bạn có thể thấy từ bảng trên rằng tôi đã sử dụng kiểu dữ liệu - 'ký tự thay đổi' cho
cột 'id' . Nhưng đó là một sai lầm, bởi vì tôi luôn cho các số nguyên làm id. Vì vậy, sử dụng varchar ở đây là một thực hành không tốt. Vì vậy, hãy thử thay đổi kiểu cột thành số nguyên.

ALTER TABLE test ALTER COLUMN id TYPE integer;

Nhưng nó trả về:

LỖI: cột “id” không thể được truyền tự động sang kiểu số nguyên Trạng thái SQL: 42804 Gợi ý: Chỉ định một biểu thức USING để thực hiện chuyển đổi

Điều đó có nghĩa là chúng ta không thể thay đổi kiểu dữ liệu một cách đơn giản vì dữ liệu đã có sẵn trong cột. Vì dữ liệu thuộc loại 'ký tự thay đổi' nên postgres không thể mong đợi nó là số nguyên mặc dù chúng tôi chỉ nhập số nguyên. Vì vậy, bây giờ, như postgres đề xuất, chúng tôi có thể sử dụng biểu thức 'USING' để truyền dữ liệu của chúng tôi thành số nguyên.

ALTER TABLE test ALTER COLUMN id  TYPE integer USING (id ::integer);

Nó hoạt động.

7.) Biết ai được kết nối với Cơ sở dữ liệu
Đây ít nhiều là một lệnh giám sát. Để biết người dùng nào đã kết nối với cơ sở dữ liệu nào bao gồm IP và Cổng của họ, hãy sử dụng SQL sau:

SELECT datname,usename,client_addr,client_port FROM pg_stat_activity ;

8.) Tải lại tệp cấu hình PostgreSQL mà không cần khởi động lại máy chủ

Các tham số cấu hình PostgreSQL nằm trong các tệp đặc biệt như postgresql.conf và pg_hba.conf. Thông thường, bạn có thể cần phải thay đổi các thông số này. Nhưng để một số tham số có hiệu lực, chúng ta thường cần tải lại tệp cấu hình. Tất nhiên, khởi động lại máy chủ sẽ làm điều đó. Nhưng trong môi trường sản xuất, việc khởi động lại cơ sở dữ liệu đang được hàng nghìn người sử dụng không được ưu tiên, chỉ để thiết lập một số tham số. Trong những tình huống như vậy, chúng tôi có thể tải lại các tệp cấu hình mà không cần khởi động lại máy chủ bằng cách sử dụng chức năng sau:

select pg_reload_conf();

Hãy nhớ rằng, điều này sẽ không hoạt động đối với tất cả các tham số, một số thay đổi tham số cần khởi động lại toàn bộ máy chủ để có hiệu lực.

9.) Lấy đường dẫn thư mục dữ liệu của cụm cơ sở dữ liệu hiện tại

Có thể trong một hệ thống, nhiều trường hợp (cụm) của PostgreSQL được thiết lập, nói chung, trong các cổng khác nhau hoặc tương tự. Trong những trường hợp như vậy, việc tìm kiếm thư mục (thư mục lưu trữ vật lý) được sử dụng bởi phiên bản nào là một nhiệm vụ bận rộn. Trong những trường hợp như vậy, chúng ta có thể sử dụng lệnh sau trong bất kỳ cơ sở dữ liệu nào trong cụm mà chúng ta quan tâm để lấy đường dẫn thư mục:

SHOW data_directory;

Chức năng tương tự có thể được sử dụng để thay đổi thư mục dữ liệu của cụm, nhưng nó yêu cầu máy chủ khởi động lại:

SET data_directory to new_directory_path;

10.) Tìm một CHAR là NGÀY hay không

create or replace function is_date(s varchar) returns boolean as $$
begin
  perform s::date;
  return true;
exception when others then
  return false;
end;
$$ language plpgsql;

Cách sử dụng: phần sau sẽ trả về True

select is_date('12-12-2014')
select is_date('12/12/2014')
select is_date('20141212')
select is_date('2014.12.12')
select is_date('2014,12,12')

11.) Thay đổi chủ sở hữu trong PostgreSQL

REASSIGN OWNED BY sa  TO postgres;

12.) THIẾT BỊ GỬI PGADMIN PLPGSQL

Giải thích rõ ở đây


+1 cho 2 , 3 , 6 , 9

0

Thật tiện lợi khi đổi tên một cơ sở dữ liệu cũ hơn là việc mysql có thể làm. Chỉ cần sử dụng lệnh sau:

ALTER DATABASE name RENAME TO new_name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.