Php MySQL数据库唯一列名
我为自己编写了一个PHP脚本,帮助管理一个由10名成员组成的小组。此脚本当前连接到数据库,并每周更新任何级别和电源更改。然而,我想扩展它,在一个新的表中,将获得的所有功率保存在一个单独的列中,而不是全部相加 我能想到的唯一方法是使用下面的代码创建列并更改每个列的名称Php MySQL数据库唯一列名,php,mysql,Php,Mysql,我为自己编写了一个PHP脚本,帮助管理一个由10名成员组成的小组。此脚本当前连接到数据库,并每周更新任何级别和电源更改。然而,我想扩展它,在一个新的表中,将获得的所有功率保存在一个单独的列中,而不是全部相加 我能想到的唯一方法是使用下面的代码创建列并更改每个列的名称 ALTER TABLE `power gained` ADD timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER name;
ALTER TABLE `power gained` ADD timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER name;
所以我的问题是,我是否可以创建列以确保其名称是唯一的,或者是否可以将列名设置为时间戳以保存列
我还想澄清一下,我使用的是mysql函数,因为它在我的本地系统上,不易受到攻击,我也不会愚蠢到犯错误。使用规范化。
将用户和电源拆分为两个不同的表
CREATE TABLE `users_power` (
`user_id` smallint(5) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`total_power` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
CREATE TABLE `power` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` smallint(1) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`power_increase` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
DROP TRIGGER IF EXISTS `Update users_power`;
CREATE TRIGGER `Update users_power` AFTER INSERT ON `power` FOR EACH ROW BEGIN
UPDATE `users_power` AS `UP`
SET `UP`.`total_power` = `UP`.`total_power` + NEW.`power_increase`
WHERE `UP`.`user_id` = NEW.`user_id`;
END
然后向上看,做一些类似的事情
SELECT `power` AS total_power
FROM users_power
WHERE users_power.`user_id` = 1
select * from power where user_id = 1;
+----+---------+---------------------+----------------+
| id | user_id | time | power_increase |
+----+---------+---------------------+----------------+
| 1 | 1 | 2014-08-7 17:04:06 | 5 |
| 2 | 1 | 2014-08-15 17:04:31 | 15 |
+----+---------+---------------------+----------------+
2 rows in set
select * from users_power where user_id = 1;
+---------+------+-------------+
| user_id | name | total_power |
+---------+------+-------------+
| 1 | joe | 21 |
+---------+------+-------------+
1 row in set
你的结构看起来像
SELECT `power` AS total_power
FROM users_power
WHERE users_power.`user_id` = 1
select * from power where user_id = 1;
+----+---------+---------------------+----------------+
| id | user_id | time | power_increase |
+----+---------+---------------------+----------------+
| 1 | 1 | 2014-08-7 17:04:06 | 5 |
| 2 | 1 | 2014-08-15 17:04:31 | 15 |
+----+---------+---------------------+----------------+
2 rows in set
select * from users_power where user_id = 1;
+---------+------+-------------+
| user_id | name | total_power |
+---------+------+-------------+
| 1 | joe | 21 |
+---------+------+-------------+
1 row in set
编辑
- 添加了在将记录插入电源时自动更新总电源的触发器
- 我还没有测试过这一点,但我想我已经找到了一种方法,可以用我理解的方式来做这件事(这是最重要的部分)
我不想从数据库中提取数据,因为我只需转到localhost/phpmyadmin就可以访问它,而且我永远不需要提取它。no。您不需要创建更多列来存储“相同但在不同时间”的数据。您创建一个子表,并将您的时间/值/用户标识存储在其中。1。请参见标准化。不,您将得到一张表。使用您的方法,您将得到大量的列,其中大部分总是空的,并且具有真正愚蠢的名称,如
2014-08-15 09:23:13
。如果每次需要查找某些内容时都不必解析表结构,您将如何找到这些列名?通过一个子表,您可以从powerups中选择sum(power),其中userID=Foo和timestamp介于'2014-06-01'和'2014-06-30'。我不需要知道您在做什么,就知道这不是一个好主意。尽管去做你想做的,但是当支持或扩展它变成一场噩梦时,不要回来抱怨。@Spedwards-你真的应该听MarcB的建议,任何其他方法都是愚蠢的。您只需要一个子表,带有userid和powergaund,然后您只需像user 1获得5一样填充它,然后您就可以在主表中对它们求和,直到添加一个额外的列,这是一种非常糟糕的方式。如果将来你想提取它呢?这种方法不是未来的证明。@hd。我仍然可以很容易地提取这个。。。列名只是每个星期五的日期。所以2014-08-08
,2014-08-15
,2014-08-22
等等。