Mysql 如何为每个播放器创建唯一的索引?

Mysql 如何为每个播放器创建唯一的索引?,mysql,sql,Mysql,Sql,我有一张这样的桌子 T1 Name Surname Team John Fire Team1 Mike Ice Team2 Don Grass Team3 John Fire Team4 Jake Finger Team1 T1 ID Name Surname Team JF-1 John Fire Team1 MI-1 M

我有一张这样的桌子

 T1       
 Name Surname     Team
 John   Fire      Team1
 Mike   Ice       Team2
 Don    Grass     Team3
 John   Fire      Team4
 Jake   Finger    Team1
 T1       
   ID   Name   Surname     Team
  JF-1  John    Fire       Team1
  MI-1  Mike     Ice       Team2
  DG-1  Don    Grass       Team3
  JF-1  John    Fire       Team4
  JF-2  Jake    Finger     Team1
我想创建添加到名为ID的表列中

ID将包括:

“名字的第一个字母”+

“姓首字母”+

“——”+

如果之前有相同的首字母,则数字会自动增加

看起来是这样的

 T1       
 Name Surname     Team
 John   Fire      Team1
 Mike   Ice       Team2
 Don    Grass     Team3
 John   Fire      Team4
 Jake   Finger    Team1
 T1       
   ID   Name   Surname     Team
  JF-1  John    Fire       Team1
  MI-1  Mike     Ice       Team2
  DG-1  Don    Grass       Team3
  JF-1  John    Fire       Team4
  JF-2  Jake    Finger     Team1
我需要在代码中添加什么

#LAST TRY

create table T1 (
Name varchar(45),
Surname varchar(45),
Team varchar(45));

insert into T1(Name,Surname,Team) values ( 'John','Fire','Team1'),   ('Mike','Ice','Team2'),
('Don','Grass','Team3'),('John','Fire','Team4'),('Jake','Finger','Team1');

select * from T1;

鉴于您发布的新信息,您实际上并没有创建具有唯一字段的表。您要做的是创建一个表,其中一个给定的人可以出现N次,因此他们需要一个对他们来说完全唯一的标识符(例如,两个人的名字和姓氏相同)。在不合并表以便每个玩家只出现一次的情况下,在该行上枚举他们的所有团队,您只需要在插入时定义这些ID。所以

create table T1 (
ID varchar(4),
Name varchar(45),
Surname varchar(45),
Team varchar(45));
然后修改插入以包含ID:

insert into T1(ID,Name,Surname,Team) values ( 'JF-1','John','Fire','Team1')

等等。

创建Id的基本方法:

select * from(
select substring(Name,1,1), substring(Surname,1,1),
row_number() over (partition by Name,Surname order by Team)) from t1;
将检查语法并展开

方法:从名字中选择第一个字母,从第二个名字中选择第二个字母,然后根据姓名分组,确定要插入的号码

编辑: 尝试将此作为MySQL的实现

select concat(concat(concat(SUBSTRING(NAME,1,1),SUBSTRING(SURNAME,1,1)),'-'),num) AS ID,
NAME,SURNAME,TEAM from

                            (SELECT 
    @row_number:=CASE
        WHEN @customer_no = SUBSTRING(NAME,1,1) and @customer2 = SUBSTRING(SURNAME,1,1)
        THEN @row_number + 1
        ELSE 1
    END AS num,
    @customer_no:=SUBSTRING(NAME,1,1) as CustomerNumber,
    @customer2 :=  SUBSTRING(SURNAME,1,1) as Customer2,
    @team := team                         
    team,name,surname
FROM
    T1 order by SUBSTRING(NAME,1,1), SUBSTRING(SURNAME,1,1),TEAM) as final;
呸!!是参考链接。但是真的!!为什么你不能给我们一些基本的分析函数


Fiddle:

看起来您得到的表格是几个实体的组合

实体关系建模是数据库设计的关键

实体是可以唯一标识的人、地点、事物、概念或事件,对企业很重要,我们可以存储有关实体的信息

确定实体和基数之间的关系

“玩家”是零个、一个或多个“团队”的成员 “团队”由零个或多个“玩家”组成

识别实体的候选密钥。确定哪些属性属于哪些实体

“玩家”有一个“出生日期”。 “玩家”有一个“名字”和一个“姓氏”

在实现物理设计之前,您应该努力使数据模型达到第三种标准形式。(在性能需要的地方进行非规范化,但在实现之前,不要跳过先达到3NF的步骤。)

一旦您的模型在3NF中,那么建议从每个实体的单独表开始实施

作为播放器/个人实体的示例表定义,添加代理键作为主键:

create table player 
( id         int unsigned not null primary key auto_increment comment 'PK'
, surname    varchar(30)  comment 'last name'
, givname    varchar(30)  comment 'first name'
, dob        date         comment 'date of birth'
, UNIQUE KEY player_UX1 (surname, givname)
) engine=innodb
;

忽略任何时态需求,将“玩家”和“团队”之间的多对多关系实现为一个关系表,外键引用每个表

create table current_team_member
( team_id      int unsigned not null comment 'FK, ref team.id'
, player_id    int unsigned not null comment 'FK, ref player.id'
, date_joined  date
, ...
, PRIMARY KEY (team_id, player_id, ... )
, CONSTRAINT FK_current_team_member_team
    FOREIGN KEY (team_id)  REFERENCES team(id)
, CONSTRAINT FK_current_team_member_player
    FOREIGN KEY (player_id) REFERENCES player(id) 
) engine=innodb;


名字的第一个字母+姓氏的第一个字母+“-”+字母顺序将确定破折号后的数值。约翰·史密斯之前的15个名字=JS-16@Marcis-除了创建一个包含随机名称/团队的表之外,您还尝试过自己做这件事吗?您确定要那个索引吗?如果John David和Joe Dirt在同一个团队1中呢?如果我错了,他们可能会纠正我,但团队编号似乎完全独立于为此创建ID。这个例子会让你相信是这样的,但看看“MI-1 Mike Ice Team2”仍然是MI-1的方式。不要这样做:-(因为它毫无用处。不幸的是,问题已经改变了。@3我想告诉你我是否要写唯一的(ID)它将显示错误,因为ID对于该列不是唯一的!如果值不是唯一的,那么您不需要在末尾添加唯一约束。我添加了唯一约束,因为您的问题是如何创建唯一索引。啊,我现在明白了-同一个人可以在多个团队中。在这种情况下,您当然不需要“不需要为ID字段添加唯一的限定符。@3nails4you,但我不想手动插入它我希望它是为我创建的!学习1:行号()mysql中不存在是的,目前不会。因为我是Oracle DB person,mysql中不存在row_number。正在搜索替代项。@Marcus,这段代码故意生成JF-3,因为我觉得ID必须是唯一的。在您的示例中,有两个JF-1。只需通知您是否按原样进行。提示:如果是,则游戏按移动顺序不进行o全名而不是子字符串。你写的这段代码很好,但我希望表中有两个JF-1!我对英语不是很在行!如果我理解正确,你是说表看起来不可行?我最好给每一行一个唯一的ID?每个玩家都应该有一个唯一的键。每个队都应该有一个唯一的键e键。它可以是复合键,也可以是单列。在许多情况下,我们发现作为主键的代理项id满足主键的几个理想属性…非空(在每行上分配)、唯一(无重复值)、简单(单列具有短的本机数据类型)、匿名(不携带任何有意义的信息)、不可变(分配一次,不会改变)等。(1NF和2NF对我来说都没有意义。给我这些,我看到的只是不是3NF的模型。)我不会在主键中包含玩家名字和姓氏的首字母。(如果我们这样做,当玩家的名字改变时,就会希望改变主键的值,因为“前两个字符来自玩家的名字”。这违反了代理项匿名的理想属性。我不希望代理项项依赖于实体属性的值。只有一个简单的无意义整数对我有效。好的,现在我明白了!为了ID,最好使用不能更改或只是随机给定的数据,并且没有附加到其他值!R对吧?就我个人而言,我认为那些将杂乱无章的混乱转化为第一范式,然后再转化为第二范式,然后再转化为第三范式的学术练习