我在postgreSQL数据库中有以下列
column | character varying(10) | not null default 'default'::character varying
我想放弃它,但是数据库是巨大的,如果它在很长一段时间内阻止更新,我将被公开鞭打,并可能被抽取和四分之一。我发现了一个来自braintree的博客,here,这表明这是一个安全的操作,但它有点模糊。
答案 0 :(得分:3)
确实删除了列阻止PostgreSQL数据库
答案是否定的,因为它不会阻止数据库。
但是,任何DDL语句都要求更改表上的独占锁。这意味着没有其他事务可以访问表。因此表格被阻止了#34;而不是数据库。
然而,删除列的时间实际上非常短,因为列没有从表中删除,但只是标记为不再存在。
并且不要忘记commit
DDL语句(如果您已关闭自动提交),否则表将被阻止,直到您提交更改为止。
答案 1 :(得分:3)
ALTER TABLE
命令需要获取表上的ACCESS EXCLUSIVE
锁,这将阻止尝试访问该表的所有内容,包括SELECT
s,并且顾名思义,需要等待现有的操作完成,因此它可以是独占的。
因此,如果您的表格非常繁忙,它可能无法获得实际获取独占锁定的机会,并且只会阻止功能上的永久锁定。
这还取决于此列是否具有大量索引和依赖项。如果存在依赖关系(即外键或视图),则需要将CASCADE
添加到DROP COLUMN
,这将增加需要完成的工作,以及时间量它需要持有独家锁。
所以,它没有风险。但是,在尝试之后你应该相当快地知道它是否可能会长时间阻塞。如果您可以尝试并安全地花费一两分钟可能阻止该表,那么值得一试 - 尝试下降并查看。如果它在相对较短的时间内没有完成,则中止命令,您可能需要至少安排一些正在敲击桌面的应用程序的停机时间。 (您可以查看服务器活动和锁定活动,以试图猜测该表格的主要内容。)