我自己写了一个PHP脚本来帮助管理一个由10名成员组成的小队。此脚本当前连接到数据库并每周更新更新任何等级和功率更改。但是,我想扩展它并在一个新表中,将所有获得的功率保存在一个单独的列中,而不是全部添加。
我能想到的唯一方法是使用以下代码创建列并更改每个列的名称。
ALTER TABLE `power gained` ADD timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER name;
所以我的问题是,我是否可以创建列以确保其名称是唯一的,或者是否可以将列名设置为时间戳,因为这样可以节省一列。
我还想明确表示我正在使用mysql_函数,因为这是在我的本地系统上,不容易受到攻击,我也不会犯错误。
答案 0 :(得分:3)
使用规范化。
将用户和权力分成两个差异表。
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
power
答案 1 :(得分:-3)
Haven尚未对此进行过测试,但我认为我找到了一种方法可以用我理解的方式(这是最重要的部分)来实现。
$now = date('Y-m-d');
mysql_query("ALTER TABLE `power gained` ADD `$now` VARCHAR(22) AFTER name");
// ...
mysql_query("UPDATE `power gained` (`$now`) VALUES($gained) WHERE id = $i");
我不想从数据库中提取数据,因为我可以通过访问localhost / phpmyadmin来访问它,而且我不需要提取它。