use*_*578 8 sql postgresql ddl
我想在PostgreSQL中做类似的事情
CREATE UNIQUE INDEX IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)
任何的想法?
Tor*_*rge 11
如果此语句中存在具有给定名称的索引,则可以检查.
如果您的索引名称是 some_table_some_field_idx
SELECT count(*) > 0
FROM pg_class c
WHERE c.relname = 'some_table_some_field_idx'
AND c.relkind = 'i';
Run Code Online (Sandbox Code Playgroud)
从Postgres 9.5开始你甚至可以使用
CREATE INDEX IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)
只是另一个现成的解决方案.
PostgreSQL v9.0 +:
DO $BLOCK$
BEGIN
BEGIN
CREATE INDEX index_name ON table_name( column_name );
EXCEPTION
WHEN duplicate_table
THEN RAISE NOTICE 'index ''index_name '' on table_name already exists, skipping';
END;
END;
$BLOCK$;
Run Code Online (Sandbox Code Playgroud)
PostgreSQL v9.5 +:
CREATE INDEX IF NOT EXISTS index_name ON table_name( column_name );
Run Code Online (Sandbox Code Playgroud)
我已经使用PLSQL函数包装了a_horse_with_no_name的代码,以便更方便地使用.我希望有人会发现它很有用.
CREATE OR REPLACE FUNCTION create_index(table_name text, index_name text, column_name text) RETURNS void AS $$
declare
l_count integer;
begin
select count(*)
into l_count
from pg_indexes
where schemaname = 'public'
and tablename = lower(table_name)
and indexname = lower(index_name);
if l_count = 0 then
execute 'create index ' || index_name || ' on ' || table_name || '(' || column_name || ')';
end if;
end;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
用法:选择create_index('my_table','my_index_name','id');
小智 4
为此,您需要一些程序代码,如下所示(未经测试!):
do
$$
declare
l_count integer;
begin
select count(*)
into l_count
from pg_indexes
where schemaname = 'public'
and tablename = 'your_table'
and indexname = 'your_index_name';
if l_count = 0 then
execute 'create unique index public.your_index_name on public.your_table(id)';
end if;
end;
$$
Run Code Online (Sandbox Code Playgroud)