如何解决如何避免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 举报,一经查实,本站将立刻删除。