MYSQL:基于另一列创建唯一ID

时间:2019-03-01 00:59:04

标签: mysql sql

如果我在数据库中有以下列:

if('src' in elem){
   //src is a valid attribute for elem
}

我想更改表并基于“电子邮件”列创建唯一的ID列。如下所示:

<label>Element Type: <input type="text" id="elemType"/></label>
<br/>
<button id="process">
Process
</button>
<p id="result">
</p>
<script>
var elemTypeInput = document.getElementById("elemType"), processBtn = document.getElementById("process"), res = document.getElementById("result");
processBtn.addEventListener("click", function(e){
	var elemType = elemTypeInput.value;
  if(!elemType.trim()){
  	res.textContent = "Element Type can not be empty!";
  } else {
    try{
    var elem = document.createElement(elemType);
    var hasSrc = 'src' in elem;
    res.textContent = elemType + " element has src attribute: " + hasSrc;
    } catch(e){
    	res.textContent = "Please enter a valid element type.";
    }
    }
});
</script>

4 个答案:

答案 0 :(得分:2)

我建议您使用整数作为值-而不是字符串。然后,您可以将变量用于分配:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>

<div class="slides">
  <div class="slide slide1">Slide 1</div>
  <div class="slide slide2">Slide 2</div>
  <div class="slide slide3">Slide 3</div>
  <div class="slide slide4">Slide 4</div>
  <div class="slide slide5">Slide 5</div>
</div>

如果运行子查询,您将看到它为每封电子邮件分配了一个不同的编号。

然后,外部查询将此数字分配给alter table t add email_id int; update t join (select email, (@rn := @rn + 1) as rn from (select distinct email from t order by email) t cross join (select @rn := 0) params ) tt on t.email = tt.email set t.email_id = tt.rn; 列。在MySQL 8+中,您还可以编写:

email_id

答案 1 :(得分:1)

如果您使用的是MySQL 8或更高版本,则DENSE_RANK在此处提供了一个不错的选择:

SELECT
    Email,
    LPAD(CAST(DENSE_RANK() OVER (ORDER BY Email) AS CHAR(3)), 3, '0') AS Email_ID
FROM yourTable
ORDER BY
    Email;

我建议可能只是在表中添加一个自动递增列,但这并不能完全满足您的要求,因为自动递增列将始终是唯一的。

答案 2 :(得分:1)

这就是我要做的...

  1. 使用唯一的 for element in B: element + '_norm' = (element - element.mean())/ (element.max() - element.min()) 列创建新表

    email
  2. 使用您的当前数据进行播种

    CREATE TABLE `emails` (
      id INT(3) PRIMARY KEY AUTO_INCREMENT,
      email VARCHAR(255) UNIQUE
    );
    
  3. 更改现有表以引用INSERT INTO `emails` (`email`) SELECT DISTINCT `email` FROM `some_mystery_table` ORDER BY `email`; 作为外键。这可能有点棘手,因为您可能需要(可能)

    1. 在需要的地方添加新的emails(id)int
    2. 使用与电子邮件地址相对应的email_id值更新数据

      id
    3. 删除UPDATE some_mystery_table, emails INNER JOIN emails ON some_mystery_table.email = emails.email SET some_mystery_table.email_id = emails.id;

    4. 添加一个外键,其中email引用email_id
  4. 在显示数据时,您需要使用零填充的电子邮件emails(id),请加入id表,例如

    emails
  5. 添加新的电子邮件记录时,首先将它们添加到SELECT a.whatever, e.email, LPAD(e.id, 3, '0') AS email_id FROM some_mystery_table a INNER JOIN emails e ON a.email_id = e.id; ,然后在任何其他相关表中使用生成的emails

答案 3 :(得分:0)

ALTER TABLE emails add column `email_id` int(5) ZEROFILL PRIMARY KEY AUTO_INCREMENT;
SET @x:=0;
UPDATE emails SET email_id = LPAD(@x:= (@x+1),4, '0') WHERE 1=1;

我们首先使用以下查询将列email_id添加到表emails并将其设置为主键:

ALTER TABLE emails add column `email_id` int(5) ZEROFILL PRIMARY KEY AUTO_INCREMENT;

然后,我们声明一个名为x的全局变量,默认值为0:

SET @x:=0;

最后,我们用增量零填充ID填充列:

UPDATE emails SET email_id = LPAD(@x:= (@x+1),4, '0') WHERE 1=1;

我们用LPAD填充了零。

相关问题