精华内容
下载资源
问答
  • 一定要先删除sc表中的某元组行,,, 再删除course表中元组行 course SC 删除course表中元组行,,出现错误 sc ---->参照 course P155 删除元组 行 破坏 参照完整性 转载于:...

    一定要  先删除 sc表 中的  某元组   行,,,

    再删除  course表中的  元组行

     

    course表

     

    SC表

     

     

    删除  course表中的  元组行,,出现错误

     sc    ---->参照 course

    P155 删除元组 行    破坏 参照完整性   

     

     

     

    转载于:https://www.cnblogs.com/wangprince2017/p/7678021.html

    展开全文
  • 每当更新或删除PostgreSQL表中的行,就会留下死行。VACUUM处理这些死行,以便可以重复使用空间。如果不对进行vacuum,它将变得膨胀,这浪费了磁盘空间并减慢了顺序扫描的速度(在较小extents上是.

    作者:Laurenz Albe是CYBERTEC的高级顾问和支持工程师。自2006年以来,他一直在PostgreSQL上工作并为PostgreSQL做贡献。
    译者:类延良,任职于瀚高基础软件股份有限公司,PostgreSQL数据库技术爱好者,10g &11g OCM,OGG认证专家

    每当更新或删除PostgreSQL表中的行时,就会留下死行。VACUUM处理这些死行,以便可以重复使用空间。如果不对表进行vacuum,它将变得膨胀,这浪费了磁盘空间并减慢了顺序表扫描的速度(在较小extents上是索引扫描)。

    VACUUM还负责freeze表中的行,以免在事务ID计数器回绕时避免出现问题,但这是另一回事。
    通常,您不必关心所有这些,因为PostgreSQL内置的autovacuum守护程序可以为您完成这些工作。

    问题

    如果您的表变得膨胀,首先检查的是autovacuum是否已对其进行处理:

    SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum
    FROM pg_stat_all_tables
    ORDER BY n_dead_tup
        / (n_live_tup
           * current_setting('autovacuum_vacuum_scale_factor')::float8
              + current_setting('autovacuum_vacuum_threshold')::float8)
         DESC
    LIMIT 10;
    

    如果您膨胀的表未在此处显示,n_dead_tup为零且last_autovacuum为NULL,则可能是statistics collector存在问题。
    如果膨胀的表位于上述查询结果的顶部,但last_autovacuum为NULL,则可能需要将autovacuum配置为更具侵略性,这样这些膨胀的表就可以得到处理。
    但是有时结果看起来像这样:

     schemaname |    relname   | n_live_tup | n_dead_tup |   last_autovacuum
    ------------+--------------+------------+------------+-----------------
     laurenz    | vacme         |      50000 |      50000  | 2018-02-22 13:20:16
     pg_catalog | pg_attribute |         42 |        165 |
     pg_catalog | pg_amop      |        871 |        162 |
     pg_catalog | pg_class     |          9 |         31 |
     pg_catalog | pg_type      |         17 |         27 |
     pg_catalog | pg_index     |          5 |         15 |
     pg_catalog | pg_depend    |       9162 |        471 |
     pg_catalog | pg_trigger   |          0 |         12 |
     pg_catalog | pg_proc      |        183 |         16 |
     pg_catalog | pg_shdepend  |          7 |          6 |
    (10 rows)
    

    这里显示:autovacuum最近在运行,但是它没有释放死的元组!
    我们可以通过运行VACUUM (VERBOSE)以下命令来验证问题:

    test=> VACUUM (VERBOSE) vacme;
    INFO:  vacuuming "laurenz.vacme"
    INFO:  "vacme": found 0 removable, 100000 nonremovable row versions in
           443 out of 443 pages
    DETAIL:  50000 dead row versions cannot be removed yet,
             oldest xmin: 22300
    There were 0 unused item pointers.
    Skipped 0 pages due to buffer pins, 0 frozen pages.
    0 pages are entirely empty.
    CPU: user: 0.01 s, system: 0.00 s, elapsed: 0.01 s.
    

    为什么VACUUM不删除死行?

    VACUUM只能删除不再需要的行版本(也称为“元组”)。符合如下条件的元组是不再需要的元组:如果删除事务的事务ID(存储在xmax系统列中)早于PostgreSQL数据库(或共享表的整个集群)中仍在活动的最旧事务。
    该值(上面VACUUM输出中的22300 )称为“ xmin horizon”。

    在PostgreSQL集群中,有三个因素可以阻止xmin horizon的出现:
    长事务:
    您可以通过以下查询找到长事务及其xmin值:

    SELECT pid, datname, usename, state, backend_xmin
    FROM pg_stat_activity
    WHERE backend_xmin IS NOT NULL
    ORDER BY age(backend_xmin) DESC;
    

    您可以使用该pg_terminate_backend()函数终止阻塞您进行VACUUM的数据库会话。

    废弃的复制槽:
    复制槽是一种数据结构,用于保持PostgreSQL服务器防止丢弃掉那些被standby server用来追赶primary server的信息。
    您可以通过以下查询找到所有复制槽及其xmin值:

    SELECT slot_name, slot_type, database, xmin
    FROM pg_replication_slots
    ORDER BY age(xmin) DESC;
    

    可以使用pg_drop_replication_slot()函数来drop掉那些不再需要的复制槽。
    请注意:如果 hot_standby_feedback = on,这只可能发生在物理复制环境中。对于逻辑复制,存在类似的危险,但是仅影响系统目录。在这种情况下,请检查catalog_xmin列。

    Orphaned prepared transactions:
    在两阶段提交期间,首先使用该PREPARE语句准备分布式事务,然后使用该COMMIT PREPARED语句进行提交。
    一旦事务被准备好,它就会一直“hanging around”,直到被提交或中止。它甚至必须在服务器重启后才能幸免!通常,事务不会长时间保持在prepared状态,但有时会出问题,并且管理员必须手动删除 prepared transactions 。
    您可以通过以下查询找到所有prepared transactions及其xmin值:

    SELECT gid, prepared, owner, database, transaction AS xmin
    FROM pg_prepared_xacts
    ORDER BY age(transaction) DESC;
    

    使用ROLLBACK PREPAREDSQL语句删除准备好的事务。

    原文链接:
    https://www.cybertec-postgresql.com/en/reasons-why-vacuum-wont-remove-dead-rows/

    更多精彩内容,请关注以下平台、网站:

    中国PostgreSQL分会官方公众号(技术文章、技术活动):
    开源软件联盟PostgreSQL分会

    中国PostgreSQL分会技术问答社区:
    www.pgfans.cn

    中国PostgreSQL分会官方网站:
    www.postgresqlchina.com

    展开全文
  • 如何创建仅包含一个元组(即(()))的元组? 我尝试了tuple(tuple()),tuple(tuple(tuple())),tuple([])和tuple(tuple([])),它们都给了我()。我使用这种东西的原因如下:假设您有n个袋子和m个物品。 为了表示包中的...

    如何创建仅包含一个空元组(即(()))的元组? 我尝试了tuple(tuple()),tuple(tuple(tuple())),tuple([])和tuple(tuple([])),它们都给了我()。

    我使用这种东西的原因如下:假设您有n个袋子和m个物品。 为了表示包中的项目列表,我使用了长度为n的tuple,其中该元组的每个元素都是包的代表。 袋子可能是空的,用()标记。 现在,在一开始的时候,我只有一个装满空东西的袋子!

    空元组文字是(),而不是(,)

    @vaultah已更正。 :)

    "现在,在某个开始的时候,我只有一个装满空东西的袋子!"请注意,元组是不可变的,因此空元组基本上是无用的,因为您以后无法向其中添加项目。如果需要,您应该考虑使用列表。

    @DeepSpace没错。然后使用该元组创建一个新的元组,并将所有元组存储在某个地方以进行日志记录。

    IMO似乎您应该使用列表而不是元组。然后,创建列表列表,在外部列表或内部列表中添加和删除项目非常简单。 a = [[]]

    内部有5个元组的元组是((),)*5。

    @jeffery_the_wind这不会创建我想要的那个,但是感谢您提供lists。它在以下工作代码tuple([tuple()])中为我提供了帮助。同样,以下答案只是基于元组,这是非常可取的。

    @DeepSpace:一个空的元组是没有用的,因为与None不同,您仍然可以对其执行any()和len()之类的序列操作。测试None的需求可能会使原本优雅的迭代循环变得混乱,并且不对其进行测试可能会导致意外的异常。

    除了逗号混淆之外,这里的主要见解是tuple()构造函数是转换器,而不是容器。也就是说,您必须为其提供某种容器(从技术上讲是迭代器)。这就是为什么tuple(1)是TypeError的原因。因此,尽管tuple()确实是一个空元组,但tuple(tuple())只是将其转换为另一个空元组。

    空元组是()(或更冗长和较慢的tuple()),而只有一项(例如整数1)(称为单例)的元组是(1,)。 。因此,仅包含空元组的元组为

    1((),)

    以下是一些显示效果的结果:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11>>> a=((),)

    >>> type(a)

    >>> len(a)

    1

    >>> a[0]

    ()

    >>> type(a[0])

    >>> len(a[0])

    0

    这是对实际问题的正确答案,但请注意,这并未显示如何创建简单的空元组。 如果您只是看一个空的元组,而不是包含一个空元组的元组,请小心!

    @ innov8:我的答案以"空元组为()"开头。 它确实"显示了如何创建一个简单的空元组"。 然后继续说明如何"创建只包含一个空元组的元组"。

    @rory_daulton您的答案是对问题的完美答案。 我的观点是,您可以在该页面上登陆另一个问题,即如何创建一个空元组-这是另一个问题。 当然,您没有集中在没有被问到的问题上!

    我不惊讶这个(())没有起作用,因为外部括号被解释为-括号。所以(()) == (),就像(2) == 2。这应该起作用,但是:

    1((),)

    tuple()是唯一真正的空元组,但是()和((),)创建一个长度为1的元组,其中包含长度为0的元组-本身不是长度为零的元组。

    如果您想回答"如何创建一个空(或长度为零)的元组...。",我发现此帖子的搜索内容为"如何创建一个空的元组",那么您会发现这不是一个相同的问题,但是可以被误认为是这个问题(就像搜索一样),所以我尽管会提供以下答案:

    您如何简单地创建一个空元组?

    原始问题可能会误导您,因为原始答案几乎可以作为一个空的元组使用,但确实无法通过一项测试。

    (),会按照前面的答案使用((),)创建一个'空'元组,({[((((((((),))))))也会起作用,实际上您可以使用任何数字在您选择的外括号中,它们仅用作括号。但是,python在打印元组时会添加一组外括号。

    空括号是"无价值"的非标准表示形式,并且在末尾加上逗号会使"无价值"成为元组。但这是一个具有"无值"条目的元组,而不是一个空元组。

    注意:这不是零长度的元组,如其他示例所示。外部元组是一个具有一个值的元组,只有该值本身才是空元组。因此,这会在另一个元组内部创建一个空的元组,而另一个元组不为空。对于一个真正的空元组,请使用tuple(),尽管()的行为类似,但这并不完全正确。

    1

    2

    3

    4

    5

    6

    7

    8

    9>>> a = (),

    >>> type(a)

    >>> len(a)

    1

    >>> a

    ((),)

    >>> len(a[0]) # the inside tuple is empty, just not the outside one

    0

    类似地,对于长度为1但值(在b的情况下为零,在c的示例中为")的元组

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17>>> b = 0,

    >>> type(b)

    >>> len(b)

    1

    >>>b

    (0,)

    # now with an empty string

    >>> c ="",

    >>> type(c)

    >>> len(c)

    1

    >>>c

    ('',)

    >>> len (c[0]) # same len of c[0] as with 'empty' tuple

    0

    因此,包含了用于显示元组的外括号,但实际上不是元组的一部分,也不需要用于创建元组。

    但是,所有这些方括号方法在外层都不是真正的空白,这也是有用例的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15>>> a = ((),) # extra brackets just to show same as other answers

    >>> len(a)

    1

    >>> if a:

    print("not empty")

    not empty

    >>> e = tuple()

    >>> len(e)

    0

    >>> type(e)

    >>> if e:

    print("not empty")

    >>> # note...did not print...so e acts as false as an empty tuple should

    因此,如果您确实需要真正的空元组,请使用tuple(),但是如果您所需要的足够多,可以使用(),或((),)

    其中的一部分似乎仅对python 2有效,在python 3中a = (); len(a)返回0

    是的,您必须使用a =(),; len(a),因为没有结尾的逗号,您将无法获得所需的结果。 您得到一个元组,而不是一个元组中的一个元组

    展开全文
  • 元组与列表类似,但是元组中的元素不可修改。元组用小括号,列表用方括号。>>>tup1 = ('python', '... tup3 = "z", "x", "c", "v" # 不需要括号也可以创建空元组tup1 = ()元组中只有一个元素,要在元素...

    元组与列表类似,但是元组中的元素不可修改。

    元组用小括号,列表用方括号。

    >>>tup1 = ('python', 'Java', 2020, 520)

    >>> tup2 = (2, 4, 6, 8, 0 )

    >>> tup3 = "z", "x", "c", "v" # 不需要括号也可以

    创建空元组

    tup1 = ()

    元组中只有一个元素时,要在元素后面添加一个逗号,否则括号会被当作运算符去使用:

    >>>tup4 = (2)

    >>> type(tup4) # 不添加逗号时,类型为整型

    >>> tup5 = (3,)

    >>> type(tup5) # 添加逗号后,类型为元组

    元组与字符串类似,下标索引从0开始,也可以进行截取,组合等。

    访问

    元组用下标索引来访问元组中的值。

    tup6 = ('python', 'Java', 2020, 520)

    tup7 = (2, 4, 6, 8, 0)

    print ("tup6[1]: ", tup6[1])

    print ("tup7[1:3]: ", tup2[1:3])

    tup6[1]: Java

    tup7[1:3]: ( 4, 6,8)

    修改

    首先我们知道,元组的元素时不可修改的。但是元组可以进行连接。

    tup8 = (55, 56.2)

    tup9 = ('c', 'x9z')

    tup10 = tup8 + tup9

    print (tup10)

    输出结果:

    (55, 56.2 'c', 'x9z')

    删除

    还有元组元素不可删除,但是可以用del语句来删除整个元组。

    tup11 = ('python', 'Java', 2020, 520)

    print (tup11)

    del tupprint ("删除后的元组 tup11 : ")

    print (tup11)

    删除后的元组 tup :

    Traceback (most recent call last):

    File "test.py", line 8, in

    print (tup)NameError: name 'tup' is not defined

    运算符

    Python 表达式结果描述

    len((2, 4, 6)) 3 计算元素个数

    (2,4,6) + (7,8,9)(2,4,6,7,8,9)连接

    ('hh',) * 3('hh','hh','hh')复制

    1 in (1, 3, 5)True元素是否存在

    for x in (1, 3, 5): print (x,)1 3 5迭代

    索引与截取

    Python 表达式结果描述

    L[3]'python'读取第四个元素

    L[-1]'Java'反向读取,读取倒数第一个元素

    L[2:]('Java', 'python')截取元素,从第三个开始到最后的所有元素。

    展开全文
  • 元组

    2020-09-22 21:54:46
    元组中只有一个元素,需要在元素后面加, 2.元组中的数据是不可以进行修改的,如果要增添元组中的元素,我们可以新增一个元组,让两个元组进行加和。我们不可以删除元组中的元素,但是我们可以删除整个元组。 3....
  • python元组 Python元组 (Tuples in Python) Tuples are a lot like lists, and that's why we can define them in a pretty similar way as we did to define the lists. Simply put, a tuple is a ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,923
精华内容 43,569
关键字:

从一个表中删除元组时