Use one of not-null unique keys to identify rows when the target table doesn't
have a primary key. Some of users want to use not-null unique keys rather than primary keys because postgres doesn't support REINDEX PRIMARY KEY CONCURRENTLY. - Support 9.1dev. - Improve Makefile to use PGXS automatically.
This commit is contained in:
16
bin/Makefile
16
bin/Makefile
@ -15,13 +15,21 @@ PG_CPPFLAGS = -I$(libpq_srcdir)
|
||||
endif
|
||||
PG_LIBS = $(libpq)
|
||||
|
||||
ifndef USE_PGXS
|
||||
top_builddir = ../../..
|
||||
makefile_global = $(top_builddir)/src/Makefile.global
|
||||
ifeq "$(wildcard $(makefile_global))" ""
|
||||
USE_PGXS = 1 # use pgxs if not in contrib directory
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef USE_PGXS
|
||||
PGXS := $(shell pg_config --pgxs)
|
||||
PG_CONFIG = pg_config
|
||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||
include $(PGXS)
|
||||
else
|
||||
subdir = contrib/pg_reorg
|
||||
top_builddir = ../../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
subdir = contrib/$(MODULE_big)
|
||||
include $(makefile_global)
|
||||
include $(top_srcdir)/contrib/contrib-global.mk
|
||||
endif
|
||||
|
||||
|
@ -222,3 +222,20 @@ SELECT oid, relname
|
||||
-----+---------
|
||||
(0 rows)
|
||||
|
||||
--
|
||||
-- NOT NULL UNIQUE
|
||||
--
|
||||
CREATE TABLE tbl_nn (col1 int NOT NULL, col2 int NOT NULL);
|
||||
CREATE TABLE tbl_uk (col1 int NOT NULL, col2 int , UNIQUE(col1, col2));
|
||||
CREATE TABLE tbl_nn_uk (col1 int NOT NULL, col2 int NOT NULL, UNIQUE(col1, col2));
|
||||
CREATE TABLE tbl_pk_uk (col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1, col2), UNIQUE(col2, col1));
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_nn
|
||||
ERROR: relation "tbl_nn" must have a primary key or not-null unique keys
|
||||
-- => ERROR
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_uk
|
||||
ERROR: relation "tbl_uk" must have a primary key or not-null unique keys
|
||||
-- => ERROR
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_nn_uk
|
||||
-- => OK
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_pk_uk
|
||||
-- => OK
|
||||
|
@ -293,7 +293,7 @@ reorg_one_database(const char *orderby, const char *table)
|
||||
if (table.pkid == 0)
|
||||
ereport(ERROR,
|
||||
(errcode(E_PG_COMMAND),
|
||||
errmsg("relation \"%s\" has no primary key", table.target_name)));
|
||||
errmsg("relation \"%s\" must have a primary key or not-null unique keys", table.target_name)));
|
||||
|
||||
table.create_pktype = getstr(res, i, c++);
|
||||
table.create_log = getstr(res, i, c++);
|
||||
|
@ -130,3 +130,19 @@ SELECT oid, relname
|
||||
WHERE relkind = 'r'
|
||||
AND reltoastrelid <> 0
|
||||
AND reltoastrelid NOT IN (SELECT oid FROM pg_class WHERE relkind = 't');
|
||||
|
||||
--
|
||||
-- NOT NULL UNIQUE
|
||||
--
|
||||
CREATE TABLE tbl_nn (col1 int NOT NULL, col2 int NOT NULL);
|
||||
CREATE TABLE tbl_uk (col1 int NOT NULL, col2 int , UNIQUE(col1, col2));
|
||||
CREATE TABLE tbl_nn_uk (col1 int NOT NULL, col2 int NOT NULL, UNIQUE(col1, col2));
|
||||
CREATE TABLE tbl_pk_uk (col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1, col2), UNIQUE(col2, col1));
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_nn
|
||||
-- => ERROR
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_uk
|
||||
-- => ERROR
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_nn_uk
|
||||
-- => OK
|
||||
\! pg_reorg --dbname=contrib_regression --no-order --table=tbl_pk_uk
|
||||
-- => OK
|
||||
|
Reference in New Issue
Block a user