我已经创建了一个包含几个表的数据库,其中包括名为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'”。有人知道哪里出了问题吗?
1条答案
按热度按时间ltskdhd11#
在运行
ALTER TABLE
语句之前,某个并发事务已经访问了该表,并且该事务仍然处于打开状态。这样的事务在表上有一个(可能是弱的)锁,它阻塞了ALTER TABLE
所需的ACCESS EXCLUSIVE
锁。一旦您的
ALTER TABLE
挂起,所有其他对表的访问都将被阻止,因为它必须排在ACCESS EXCLUSIVE
锁后面。找到访问
comments
且从未关闭其事务的会话,并使用pg_terminate_backend()
杀死它。