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:
Takahiro Itagaki
2011-01-06 09:35:15 +00:00
parent d8d39cc948
commit 232c9bb6c9
9 changed files with 95 additions and 15 deletions

View File

@ -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

View File

@ -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

View File

@ -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++);

View File

@ -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