小编leo*_*edy的帖子

UNIQUE,UNIQUE KEY和CONSTRAINT'name'UNIQUE有什么区别?

我有一个基本的"用户"表,我想在MySQL中创建.

我不希望在数据库中出现重复的电子邮件或重复的用户名.

  • 在创建桌子时防止这种情况的最佳方法是什么?
  • 以下是有什么区别的:

1. UNIQUE(用户名),UNIQUE(电子邮件),

2. UNIQUE KEY(用户名),UNIQUE KEY(电子邮件),

3. CONSTRAINT ucons_login UNIQUE(用户名,电子邮件),

我假设其中一些是同义词,但我一直在网上阅读相互矛盾的信息并且正在寻求确认.

我希望有人可以提供帮助.

SQL:

CREATE TABLE users (
  user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  username VARCHAR(30) NOT NULL,
  pass CHAR(40) NOT NULL,
  first_name VARCHAR(20) NOT NULL,
  last_name VARCHAR(40) NOT NULL,
  email VARCHAR(60) NOT NULL,
  registration_date DATETIME NOT NULL,
  user_level TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
  active CHAR(32),
  PRIMARY KEY (user_id),
  UNIQUE (username),
  UNIQUE (email),
  INDEX login (email, pass),
  INDEX full_name (last_name, first_name)
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)

mysql database-design unique create-table unique-constraint

19
推荐指数
1
解决办法
7312
查看次数

想要将MySQL字段的值限制为特定范围(十进制值)

我想将表格行中的字段值限制为特定范围.是否可以将我的relationship_level字段限制为[0.00到1.00]

目前我正在使用DECIMAL(2,2),它不允许DECIMAL(1,2),因为M必须> = D.我假设DECIMAL(2,2)的数据类型实际上允许来自00.00的值高达99.99?

CREATE TABLE relationships (
    from_user_id MEDIUMINT UNSIGNED NOT NULL,
    to_user_id MEDIUMINT UNSIGNED NOT NULL,
    relationship_level DECIMAL(2,2) UNSIGNED NOT NULL,
    PRIMARY KEY (from_user_id, to_user_id), 
    FOREIGN KEY (from_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
    FOREIGN KEY (to_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
    INDEX relationship_from_to (to_user_id, from_user_id, relationship_level)
) ENGINE = INNODB;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,谁能预见到任何限制?

非常感谢!

mysql decimal database-schema sqldatatypes

6
推荐指数
1
解决办法
5023
查看次数

将MySQL数据类型的值限制为特定范围(最好不是ENUM)

我想将可以存储在字段中的数据类型值限制为特定范围的整数值:[0,10].

在PHP脚本中的用户输入中,我验证并清理数据以确保它在0到10的范围内.但是,有没有办法通过某种数据类型或约束来确保在投票表本身中保持这个?

目前我将int值存储在UNSIGNED TINYINT中,当然其范围为0-255.我知道ENUM是一个选项.但是,我已经读过使用数字时不建议:http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

SQL:

CREATE TABLE votes (
vote_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
article_id MEDIUMINT UNSIGNED NOT NULL,
user_id MEDIUMINT UNSIGNED NOT NULL,
user_vote TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (vote_id),
FOREIGN KEY (article_id) REFERENCES articles (article_id) ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT article_uservoted UNIQUE KEY (user_id, article_id),
INDEX vote_value (article_id, user_id, user_vote)
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)

我希望有人可以提供帮助.

mysql enums range tinyint sqldatatypes

5
推荐指数
1
解决办法
5095
查看次数

PHP中没有Truncate函数 - 选项?

我有一个执行以下计算的算法:

  1. ((0.50*0)+ 7)/ 10 = 0.70
  2. ((0.70*10)+ 9)/ 20 = 0.80
  3. ((0.80*20)+ 7)/ 30 = 0.7666666667 - >我希望此值截断为0.76

这样它可以用于计算的其余部分:

4A.((0.76*30)+ 8)/ 40 = 0.77

不是当四舍五入保留两位小数作为饲料在0.77:

4B.((0.77*30)+ 8)/ 40 = 0.77

****以下似乎已经失败,反而迫使一轮上升至0.77:****

PHP sptrinf()函数:PHP删除小数而不进行舍入

PHP number_format()函数:PHP:显示2位小数的数字

PHP floor()函数:用PHP截断浮点数

  • 还有另外一种方法吗?
  • 是否有可能用PHP实现我想要的东西(截断到两位小数)?

请协助.非常感谢.

更新 - 已解决 好了,现在感谢dkamins和zneak.我使用了floor()方法(我假设我过去没做正确的事).但是,现在发生以下情况:

例如

(0.86*30)+ 9)/ 40 = 0.87(它应该),但在TRUNC之后它= 0.86

它如何截断0.87到0.86?这没有道理.有没有办法让它只有在超过2个小数位时才能截断?

解决了:

$numDecPlace = strlen(substr(strrchr($newRel, "."), 1));
echo '<p>Test: Number of decimal places=' .$numDecPlace. '</p>';
if($numDecPlace …
Run Code Online (Sandbox Code Playgroud)

php truncate decimal floor

5
推荐指数
1
解决办法
5531
查看次数