尝试更改表后,无法对表运行任何postgresql命令

0x6upsns  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我已经创建了一个包含几个表的数据库,其中包括名为users和recipes的表。最后,我创建了一个评论列表。下面是我如何定义这些表:

CREATE TABLE recipes(  
    id SERIAL PRIMARY KEY,
    recipe_name TEXT NOT NULL,
    num_portions INTEGER,
    preparation_time INTEGER,
    cooking_time INTEGER
);

CREATE TABLE users(
    id SERIAL PRIMARY KEY,
    username TEXT NOT NULL,
    user_password TEXT NOT NULL UNIQUE,
    last_login DATE
);

CREATE TABLE comments(
    id SERIAL PRIMARY KEY,
    id_user INTEGER NOT NULL REFERENCES users(id),
    id_recipe INTEGER NOT NULL REFERENCES recipes(id),
    comment_description TEXT NOT NULL
);

select和insert等命令在表注解上工作,直到我尝试使用以下命令添加一列:

ALTER TABLE comments
ADD COLUMN date_of_comment TIMESTAMP;

但这并没有成功,它无限期地运行。我想用DROP TABLE comments放弃它,它也可以无限期地运行。现在,当我尝试在这个表上运行任何命令(如SELECT)时,它会无限期地运行。
我尝试再次创建表注解,以检查当我尝试使用命令删除它时它是否被删除:

CREATE TABLE comments(
    id SERIAL PRIMARY KEY,
    id_user INTEGER NOT NULL REFERENCES users(id),
    id_recipe INTEGER NOT NULL REFERENCES recipes(id),
    comment_description TEXT NOT NULL,
    date_of_comment TIMESTAMP
);

但是,我得到一个错误“关系”注解“已经存在”和“无法读取未定义的属性'document'”。有人知道哪里出了问题吗?

ltskdhd1

ltskdhd11#

在运行ALTER TABLE语句之前,某个并发事务已经访问了该表,并且该事务仍然处于打开状态。这样的事务在表上有一个(可能是弱的)锁,它阻塞了ALTER TABLE所需的ACCESS EXCLUSIVE锁。
一旦您的ALTER TABLE挂起,所有其他对表的访问都将被阻止,因为它必须排在ACCESS EXCLUSIVE锁后面。
找到访问comments且从未关闭其事务的会话,并使用pg_terminate_backend()杀死它。

相关问题