微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免MySQL复合主键排列?

如何解决如何避免MySQL复合主键排列?

import pygame

# --- constants ---

disPLAY_HEIGHT = 700
disPLAY_WIDTH = 900

WHITE = (255,255,255)
BLACK = (0,0)
SKY_BLUE = (102,178,255)

FPS = 60

# --- functions ---

def fade(width,height):
    global background
    
    surface = pygame.Surface((width,height))
    surface.fill((31,97,141))

    for alpha in range(0,256):
        surface.set_alpha(alpha)

        screen.blit(surface,(0,0))

        clock.tick(FPS)

        pygame.display.update()

    print('after fade')

    background = surface
    
# --- main ---

pygame.init()
screen = pygame.display.set_mode((disPLAY_WIDTH,disPLAY_HEIGHT))

clock = pygame.time.Clock()
    
background = pygame.Surface((disPLAY_WIDTH,disPLAY_HEIGHT))
background.fill(SKY_BLUE)

#FADE_EVENT = pygame.event.custom_type()  # PyGame 2.0
FADE_EVENT = pygame.USEREVENT             # PyGame 1.9

#pygame.time.set_timer(FADE_EVENT,2000,True) # PyGame 2.0 # `once=True` - turn off after one use
pygame.time.set_timer(FADE_EVENT,2000)        # PyGame 1.9 # doesn't have `once`,it will need `set_timer(...,0)`

running = True
while running:

    screen.blit(background,0))
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == FADE_EVENT:
            pygame.time.set_timer(FADE_EVENT,0) # PyGame 1.9 # turn off after one use 
            fade(disPLAY_WIDTH,disPLAY_HEIGHT)
            
    clock.tick(FPS)
    pygame.display.update()

# - end -

pygame.quit()

在这种相互友谊关系,其中(friend_A,friend_B)与(friend_B,friend_A)相同。

我尝试添加一个唯一密钥,但无济于事:

CREATE TABLE Friends_Relations(
    buddy_id VARCHAR(255) NOT NULL,mate_id VARCHAR(255) NOT NULL,PRIMARY KEY (buddy_id,mate_id),FOREIGN KEY (buddy_id) REFERENCES Users(id) ON DELETE CASCADE,FOREIGN KEY (mate_id) REFERENCES Users(id) ON DELETE CASCADE
);

有办法避免这些排列吗?

解决方法

您可以这样做:

create table friends_relations (
  buddy_id varchar(255) not null,mate_id varchar(255) not null,constraint uq1 unique (
    (least(buddy_id,mate_id)),(greatest(buddy_id,mate_id))
  ),primary key (buddy_id,mate_id)
);

然后,如果它不接受对称行:

insert into friends_relations (buddy_id,mate_id) values (456,123);
insert into friends_relations (buddy_id,mate_id) values (123,456); -- fails

请参见db<>fiddle上的运行示例。

还有另一个技巧。或者,您可以执行buddy_id < mate_id。但是,这将限制您插入数据的方式。例如,您可以这样做:

CREATE TABLE Friends_Relations (
    buddy_id VARCHAR(255) NOT NULL,mate_id VARCHAR(255) NOT NULL,PRIMARY KEY (buddy_id,mate_id),FOREIGN KEY (buddy_id) REFERENCES Users(id) ON DELETE CASCADE,FOREIGN KEY (mate_id) REFERENCES Users(id) ON DELETE CASCADE,constraint ck1 CHECK (buddy_id < mate_id) -- added constraint
);

然后,当您插入时:

insert into Friends_Relations (buddy_id,456); -- succeeds

insert into Friends_Relations (buddy_id,123); -- fails
,

from this dba exchange question

ALTER TABLE Friends_Relation ADD UNIQUE KEY 
((least(buddy_id,mate_id)))

这允许配对以任意顺序进行,但仍然只能进行一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。